it-swarm.dev

Wie zeige ich einen einzelnen Beitrag auf der Titelseite, habe aber normalen Seitenwechsel?

Ich hätte gerne einen einzelnen Beitrag auf meiner Titelseite (immer den neuesten), aber ich lasse das normale Paging funktionieren. Die Titelseite hat also Post 1, die nächste Seite sollte Post 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 aber wenn Sie dies auf der Startseite auf "1" setzen, werden auf den weiteren Seiten auch nur einzelne Beiträge angezeigt.

Mein Hauptproblem ist, dass /page/2/ und so weiter funktioniert, aber /page/1/ immer zur eigentlichen Homepage umleitet, /. Dies bedeutet, dass die Einträge 2-10 immer übersprungen werden, da auf Seite 2 11-20 angezeigt werden. Ich derzeit löse dies durch Verlinken auf mein Archiv, aber dies ist nicht ideal, wenn Sie zu den ersten Beiträgen des Jahres kommen, und es gibt weniger Beiträge und keine offensichtliche Möglichkeit, fortzufahren.

8
Jan Fabry

Ich habe es mit dem Abfrageparameter offset gelöst. Dadurch konnte ich die Abfrage im Hook pre_get_posts bearbeiten. Dies scheint die sauberste Methode zu sein, ohne eine neue Abfrage zu erstellen. Jetzt zeigt die Homepage nur einen Beitrag und page/2/ zeigt die Beiträge 2-11. Alle Links funktionieren weiterhin, 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;
    }
}
6
Jan Fabry

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 Folgendes getan:

  1. Erstellt eine neue Seite mit dem Namen home und fügt meinen Begrüßungstext ein.
  2. Deaktiviert die Standardhomepage und legt meine benutzerdefinierte Homepage als Startseite fest
  3. Erstellt eine neue (kopierte und geänderte) Seitenvorlage
    1. lassen Sie es den Seitentext anzeigen
    2. lade drei neueste Beiträge der Kategorie X und zeige sie an
    3. darunter befindet sich ein Link "more", der auf/category/category-x/verweist.

sieht so aus: http://hinek.de

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

3
Hinek

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.php -Datei, anstatt get_template_part('loop') aufzurufen.

Danach den normalen Paging-Methoden zu folgen, ist etwas schwierig. In Ihrer loop.php -Datei empfehle ich, <?php global $paged; ?> vor die <?php if (have_posts()) : ?> -Anweisung zu stellen und die Abfrage mithilfe der Variablen $paged und der Funktion query_posts() so zu ändern, dass die richtigen Posts angezeigt werden.

Ihre loop.php Datei würde ungefähr so ​​aussehen (Anmerkung: 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 $paged - 1 verwendet, weil auf Seite 2 die Einträge 1 bis 10 und auf Seite 3 die Einträge 11 bis 20 usw. angezeigt werden.

1
john010117

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

mit query_posts () kann die Hauptabfrage einer Seite übermäßig vereinfacht und problematisch geändert werden, 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 (besonders häufig bei Seitenumbrüchen) fehl.

...

TL; DR benutze nie query_posts ();

Verwenden Sie stattdessen den Hook pre_get_posts in functions.php wie folgt:

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_posts-Hakens Ihre Paginierung beeinträchtigen kann. Das zu beheben ist nicht sehr schwer, aber es ist etwas, das man beachten muss. Es gibt ein Beispiel, wie man das hier behebt.

0
lfalin