Wie kann ich einen einzelnen Beitrag auf der Startseite anzeigen, habe aber ein normales Paging?

9

Ich möchte einen einzelnen Beitrag auf meiner Startseite haben (immer den neuesten), aber normales Paging funktionieren lassen. Die Titelseite hat also Beitrag 1, die nächste Seite sollte Beitrag 2-11 haben (1-10 ist auch in Ordnung), dann 12-21 oder 11-20 und so weiter. Ich weiß, dass ich die Anzahl der Beiträge je nach Kontext ändern kann. Wenn Sie dies jedoch auf der Startseite auf "1" setzen, wird auf den weiteren Seiten auch nur ein Beitrag angezeigt.

Mein Hauptproblem ist, dass /page/2/so weiter funktioniert, aber /page/1/immer zur realen Homepage weiterleitet /. Dies bedeutet, dass die Beiträge 2-10 immer übersprungen werden, da Seite 2 11-20 zeigt. Ich löse dieses Problem derzeit , indem ich auf mein Archiv verlinke. Dies ist jedoch nicht ideal, wenn Sie zu den ersten Posts des Jahres kommen und es weniger Posts gibt und keine offensichtliche Möglichkeit, fortzufahren.

Jan Fabry
quelle

Antworten:

7

Ich habe es mit dem offsetAbfrageparameter gelöst . Dies ermöglichte es mir, die Abfrage im pre_get_postsHook zu bearbeiten , und scheint der sauberste Weg zu sein, dies ohne eine neue Abfrage zu tun. Jetzt zeigt die Homepage nur einen Beitrag und page/2/die Beiträge 2-11. Alle Links funktionieren weiter, es sind keine weiteren Änderungen erforderlich.

add_action('pre_get_posts', 'set_offset_on_front_page');
function _set_offset_on_front_page(&$query)
{
    if (is_front_page() && is_paged()) {
            $posts_per_page = isset($query->query_vars['posts_per_page']) ? $query->query_vars['posts_per_page'] : get_option('posts_per_page');
            // If you want to use 'offset', set it to something that passes empty()
            // 0 will not work, but adding 0.1 does (it gets normalized via absint())
            // I use + 1, so it ignores the first post that is already on the front page
            $query->query_vars['offset'] = (($query->query_vars['paged'] - 2) * $posts_per_page) + 1;
    }
}
Jan Fabry
quelle
Wenn dies funktioniert, sollte das OP dies verwenden.
John010117
Was ich tue, weil ich die Frage und diese Antwort geschrieben habe. Aber danke für deine Vorschläge, sie haben mich auf den richtigen Weg gebracht.
Jan Fabry
Gibt es eine Möglichkeit, dass es auf einer archive.php oder category.php funktioniert und nur die letzten 2 Beiträge auf Seite 1 anzeigt, während die korrekte Paginierung beibehalten wird? Vielen Dank!
Amit
@Amit: Wenn Sie ersetzen is_front_page()mit is_archive()oder is_category(), ich glaube , Sie bekommen können , wo Sie sein müssen.
Jan Fabry
3

Ok, vielleicht ist dies eine seltsame oder komplizierte Methode, aber ich hatte ein ähnliches Problem (ich wollte einen Begrüßungstext und die drei neuesten Beiträge einer bestimmten Kategorie auf der Startseite anzeigen. Also habe ich:

  1. Erstellt eine neue Seite namens home und füge meinen Begrüßungstext darauf ein.
  2. Deaktivierte die Standardhomepage und legte meine benutzerdefinierte Homepage als Startseite fest
  3. Erstellt eine neue (kopierte und geänderte vorhandene) Seitenvorlage
    1. Lassen Sie es den Seitenkörper anzeigen
    2. Laden Sie drei neueste Beiträge der Kategorie X und zeigen Sie sie an
    3. Darunter befindet sich ein Link "more", der auf / category / category-x / verweist

sieht so aus: http://hinek.de (Seite ist auf Deutsch, sorry)

Wenn dies der richtige Weg für Sie sein könnte und Sie weitere Informationen oder ein Codebeispiel für die Seitenvorlage benötigen, kommentieren Sie und ich werde diesen Beitrag bearbeiten.

Hinek
quelle
Dies funktioniert, weil Sie nur Beiträge in der Kategorie "Nachricht des ... was auch immer" anzeigen und somit zu dieser Kategorieseite gehen und das normale Paging verwenden können. Ich möchte Beiträge aus allen Kategorien anzeigen, daher funktioniert dieser Ansatz bei mir nicht. Sie haben keinen Ort, an dem Personen alle Beiträge aus allen Kategorien durchsuchen können?
Jan Fabry
1

Ich gehe davon aus, dass Sie Wordpress 3.0.x ausführen.

Es ist einfach, nur einen Beitrag (in welcher Kategorie auch immer) auf der Startseite anzuzeigen. Verwenden Sie query_posts('post_per_page=1')in Ihrer home.phpDatei, anstatt aufzurufen get_template_part('loop').

Danach den normalen Paging-Methoden zu folgen, ist etwas schwierig. In Ihrer loop.phpDatei schlage ich vor, <?php global $paged; ?>vor die <?php if (have_posts()) : ?>Anweisung zu setzen und die $pagedVariable und query_posts()Funktion zu verwenden, um Ihre Abfrage so zu ändern, dass die richtigen Beiträge angezeigt werden.

Ihre loop.phpDatei würde ungefähr so ​​aussehen (Hinweis: nicht getestet):

<?php
global $paged;

if (!is_front_page() && $paged && $post->post_type == 'post') :
    query_posts('posts_per_page=10&paged=' . ($paged - 1));
    if (have_posts()) :
        while (have_posts()) : the_post();
        // Rest of the loop
        endwhile;
    endif;
endif;
?>

Ich habe es $paged - 1einfach verwendet, weil auf Seite 2 die Beiträge 1 bis 10 und auf Seite 3 die Beiträge 11 bis 20 usw. angezeigt werden.

john010117
quelle
Durch Ändern des pagedParameters wird nichts anderes beschädigt, wie das next_posts_link?. Vielleicht ist es besser, die Abfrage im pre_get_postsHook zu ändern , damit ich keine neue Abfrage erstelle? Und ja, das ist WP 3.
Jan Fabry
AFAIK, es sollte nicht beeinflussen next_posts_link. Der einzige Weg, dies herauszufinden, besteht natürlich darin, es tatsächlich zu versuchen.
John010117
1
Argh, wenn ich versuche, den pagedParameter im pre_get_postsHook zu bearbeiten , redirect_canonicaltritt er ein und möchte die URL durch den neuen pagedParameter ersetzen . In diesem Fall kann ich Umleitungen deaktivieren, next_posts_linkverwende jedoch eine globale $pagedVariable, die auf den neuen Wert gesetzt wird, aber ich weiß nicht, mit welchem ​​Code, daher ist sie falsch.
Jan Fabry
Haben Sie tatsächlich versucht, meinen Code zu verwenden und zu prüfen, ob er funktioniert? Ich bin mit dem pre_get_postsHaken nicht allzu vertraut , daher kann ich dort nicht viel helfen. Versuchen Sie auch, die $pagedVariable direkt zu ändern (z. $paged = $paged - 1)B. :), wenn Sie sich Sorgen machen next_posts_link().
John010117
0

Diese Frage ist etwas alt, aber für diejenigen, die dies in der Neuzeit finden, sollten Sie niemals query_posts aufrufen . Aus dem Wordpress-Codex:

query_posts () ist eine zu vereinfachte und problematische Methode, um die Hauptabfrage einer Seite zu ändern, indem sie durch eine neue Instanz der Abfrage ersetzt wird. Es ist ineffizient (führt SQL-Abfragen erneut aus) und schlägt unter bestimmten Umständen sofort fehl (insbesondere häufig bei der Paginierung von Posts).

...

TL; DR verwenden niemals query_posts ();

Stattdessen sollten Sie den pre_get_postsHook in functions.php wie folgt verwenden:

function hwl_home_pagesize( $query ) {
    // Behave normally for secondary queries
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( is_home() ) {
        // Display only 1 post for the home page
        $query->set( 'posts_per_page', 1 );
        return;
    }

    // Otherwise, use whatever is set in the Wordpress Admin screen
    $query->set( 'posts_per_page', get_option('posts_per_page'); );
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

Beachten Sie jedoch, dass in einigen Fällen (z. B. beim Anpassen von Post-Offsets) die Verwendung eines pre_get_postsHakens Ihre Paginierung beeinträchtigen kann. Dies zu beheben ist nicht besonders schwierig, aber es ist etwas, das man beachten muss. Es gibt ein Beispiel dafür , wie dies zu beheben hier .

lfalin
quelle