it-swarm.com.de

Wie kann ich 7 Beiträge auf der Startseite, aber 9 Beiträge auf den folgenden Seiten anzeigen?

Auf der Homepage meiner Website werden die 9 neuesten Beiträge angezeigt (über die Einstellung im Administrationsbereich). Unten befinden sich die Standard-Paginierungslinks, über die Besucher weitere Beiträge anzeigen können.

Ich möchte, dass auf der Homepage (und nur auf der Homepage) die letzten 7 Beiträge angezeigt werden, aber dann auf den folgenden Seiten - 2, 3, 4 usw. - 9 Beiträge angezeigt werden. Ich möchte auch, dass in den Kategorien und Archiven 9 Beiträge angezeigt werden.

Alle Methoden, die ich bisher ausprobiert habe, führen entweder zu fehlenden und duplizierten Beiträgen, oder ich erhalte eine zusätzliche Seite, die in der Paginierung angezeigt wird, was zu einem 404 führt.

Bis jetzt habe ich Variationen der hier geposteten Antwort ausprobiert:

Die Paginierung gibt 404 nach Seite 20 zurück.

Und auch hier (Fall 2: Bedingter Versatz):

Unterschiedliche "posts_per_page" -Einstellung für die erste und die restlichen Seiten?

Beides scheint nicht für das zu funktionieren, was ich erreichen möchte, aber ich fühle mich einer Lösung nahe und könnte etwas Offensichtliches vermissen.

Hier ist die neueste Version des Codes, den ich ausprobiert habe (hinzugefügt zu functions.php), was dazu führte, dass zu viele Paginierungslinks angezeigt wurden (der letzte Link verursachte 404):

function home_paged_offset( $query ) {
$ppp = get_option( 'posts_per_page' );
$first_page_ppp = 7;
$paged = $query->query_vars[ 'paged' ];
if( $query->is_home() && $query->is_main_query() ) {
    if( !is_paged() ) {
        $query->set( 'posts_per_page', $first_page_ppp );
    } else {
        $paged_offset = $first_page_ppp + ( ($paged - 2) * $ppp );
        $query->set( 'offset', $paged_offset );
    }
}
}
add_action( 'pre_get_posts', 'home_paged_offset' );

function home_adjust_paged_offset_pagination( $found_posts, $query ) {
$ppp = get_option( 'posts_per_page' );
$first_page_ppp = 7;
$paged = $query->query_vars[ 'paged' ];
if( $query->is_home() && $query->is_main_query() ) {
    if( !is_paged() ) {
        return( $found_posts );
    } else {
        return( $found_posts - ($first_page_ppp - $ppp) );
    }
}
return $found_posts;
}
add_filter( 'found_posts', 'home_adjust_paged_offset_pagination', 10, 2 );
2
Paul Dixon

Ok, das war wirklich knifflig. Ich habe es bisher geschafft, es zu umgehen, indem ich den globalen $wp_query von WordPress belogen habe. Hier ist, wie.

Im functions.php Ihres Themas können Sie diese Funktionen hinzufügen, um 7 Beiträge auf der ersten Seite und 9 Beiträge auf jeder anderen Seite anzuzeigen.

Okay, dieser Code funktioniert soweit, aber Sie werden feststellen, dass die Paginierung auf der ersten Seite falsch ist. Warum? Dies liegt daran, dass WordPress die Beiträge pro Seite auf der ersten Seite verwendet (das sind 7) und die Anzahl der Seiten durch Unterteilen wie (1000/7) = Gesamtzahl der Beiträge ermittelt. Bei der Paginierung müssen wir jedoch berücksichtigen, dass auf den nächsten Seiten 9 Posts pro Seite und nicht 7 angezeigt werden. Mit Filtern können Sie dies nicht tun, aber wenn Sie diesen Hack zu Ihrer Vorlage hinzufügen, bevor the_posts_pagination() function it ' Ich werde so arbeiten, wie Sie es erwarten.

Der Trick besteht darin, den max_num_pages in der globalen Variablen $ wp_query in unseren benutzerdefinierten Wert zu ändern und die WP - Berechnung während der Anzeige der Paginierungslinks nur für die erste Seite zu ignorieren.

global $wp_query;

// Needed for first page only
if ( ! $wp_query->is_paged ) {
    $all_posts_except_fp = ( $wp_query->found_posts - 7 ); // Get us the found posts except those on first page
    $wp_query->max_num_pages = ceil( $all_posts_except_fp / 9 ) + 1; // + 1 the first page we have containing 7 posts
}

Und das ist der Code, den Sie in functions.php einfügen müssen, um die Abfrage zu filtern.

add_action('pre_get_posts', 'myprefix_query_offset', 1 );
function myprefix_query_offset(&$query) {

    if ( ! $query->is_home() ) {
        return;
    }

    $fp = 7;
    $ppp = 9;

    if ( $query->is_paged ) {
        $offset = $fp + ( ($query->query_vars['paged'] - 2) * $ppp );
        $query->set('offset', $offset );
        $query->set('posts_per_page', $ppp );

    } else {
        $query->set('posts_per_page', $fp );
    }

}

add_filter('found_posts', 'myprefix_adjust_offset_pagination', 1, 2 );
function myprefix_adjust_offset_pagination($found_posts, $query) {

    $fp = 7;
    $ppp = 9;

    if ( $query->is_home() ) {
        if ( $query->is_paged ) {
            return ( $found_posts + ( $ppp - $fp ) );
        }
    }
    return $found_posts;
}
1
Ahmed Fouad

funktionspagination ($ query_string) {global $ posts_per_page, $ paged; $ my_query = new WP_Query ($ query_string. "& posts_per_page = -1"); $ total_posts = $ my_query-> post_count; if (leer ($ paged)) $ paged = 1; $ prev = $ paged - 1; $ next = $ paged + 1; $ range = 5; $ showitems = ($ range * 2) +1; $ pages = ceil ($ total_posts/$ posts_per_page); if (1! = $ pages) {echo ''; Echo ($ paged> 1 && $ showitems <$ pages)? '"':" "; für ($ i = 1; $ i <= $ pages; $ i ++) {if (1! = $ pages && (! ($ i> = $ paged + $ range-0 || $ i <= $ paged- $ range -1) || $ pages <= $ showitems)) {echo ($ paged == $ i)? ''. $ i. '': ''. $ i. '';}} Echo ($ paged <$ pages && $ showitems <$ pages)? '"':" "; Echo"\n ";}}