it-swarm.com.de

Paginieren Sie das Hinzufügen zusätzlicher Beiträge nur auf Seite 2

Nachdem ich meinem Thema so nahe gekommen bin, habe ich die letzte Hürde genommen. Grundsätzlich habe ich drei verschiedene Bereiche auf meiner Homepage:

  1. Der neueste Beitrag wird in der Kopfzeile angezeigt und als empfohlener Beitrag gekennzeichnet
  2. Zwei Beiträge darunter, die als aktuelle Beiträge gekennzeichnet sind
  3. Die restlichen Beiträge (10) sind nach Datum geordnet

Der letzte Beitrag (1) und die beiden letzten Beiträge (2) werden mit einer benutzerdefinierten WP_Query angezeigt, und die restlichen zehn Beiträge (3) werden mit der Standardschleife mit einer Versatzfunktion angezeigt, die auch die Paginierung löst, ABER ... es gibt einen Schluckauf mit Seite 2. Aus irgendeinem Grund werden drei zusätzliche Beiträge am Anfang der Liste der Beiträge hinzugefügt (3)? Danach, ab Seite 3, ist alles in Ordnung und funktioniert so, wie es sollte. Ich sollte auch erwähnen, dass die neuesten und neuesten Beiträge (1 und 2) immer oben angezeigt werden, wenn Sie durch die Seiten blättern.

Hier das Layout mit den verschiedenen Bereichen und Beitragsnummern:

 Layout 

Hier ist der Code, der für die Funktion verwendet wird, die die Hauptbeiträge (3) und die Paginierungskorrektur behandelt (der Versatz wird verwendet, um die neuesten und zuletzt über diesen gezeigten Beiträge zu überspringen):

function offset_main_query ( $query ) {
     if ( $query->is_home() && $query->is_main_query() && !$query->is_paged() ) {
         $query->set( 'offset', '3' );
    }
 }
add_action( 'pre_get_posts', 'offset_main_query' );

Jede Hilfe wäre großartig, da dies das letzte bisschen ist, das mich auslöst.

Vielen Dank :)

2
Garry Aylott

Hier ist ein Vorschlag für einen allgemeinen Weg, um andere Anzahl von Beiträgen auf derHomepageals auf denanderen Seiten/ zu unterstützen. Wir sollten, wenn möglich, dieHauptabfrageanstelle vonUnterabfragenverwenden.

Formel

Es scheint sinnvoll zu sein, dasoffsetfür Seiten mit Seitenumbrüchen wie folgt zu verwenden:

offset_op = ( paged - 1 ) * pp_op + ( pp_fp - pp_op ) + offset_fp           
          = ( paged - 2 ) * pp_op + pp_fp + offset_fp 

wobei paged (pagination), pp_fp (posts per first page), pp_op (posts per other pages) und offset_fp (offset für die erste Seite) sind nicht negative ganze Zahlen.

Für paged=1 ist der Versatz offset_fp, für andere Seiten ist er offset_op.

Beispiel 1:

Zuerst berechnen wir den Versatz für einige Seiten, um dies besser zu verstehen:

For paged=1:
    offset_fp = 0

For paged=2:
    offset_op = (2-2)*10 + 13 + 0
              = 13

For paged=3:
    offset_op = (3-2)*10 + 13 + 0
              = 10+13
              = 23
...

Hier ist eine Liste der Post-Indizes auf jeder Seite:

0,1,2,3,4,5,6,7,8,9,10,11,12    (offset_fp=0,  pp_fp=13, paged=1)
13,14,15,16,17,18,19,20,21,22   (offset_op=13, pp_op=10, paged=2)
23,24,25,26, 27,28,29,30,31,32  (offset_op=23, pp_op=10, paged=3)
...

Wir können sehen, dass der Offset mit den Indizes übereinstimmt.

Beispiel 2:

Nehmen wir pp_fp = 3, pp_op = 5, offset_fp=4 und berechnen dieoffset_op:

For paged=1:
    offset_fp = 4

For paged=2:
    offset_op = (2-2)*5 + 3 + 4
              = 7

For paged=3:
    offset_op = (3-2)*5 + 3 + 4
              = 5+3+4
              = 12
...

und vergleiche es mit den Indizes:

4,5,6          (offset_fp=4,  pp_fp=3,  paged=1)
7,8,9,10,11    (offset_op=7,  pp_op=5,  paged=2)
12,13,14,15,16 (offset_op=12, pp_op=5,  paged=3)
...

Demo Plugin

Hier ist eine Demo-Implementierung:

/**
 * Plugin Name: WPSE demo
 */
add_action( 'pre_get_posts', function( \WP_Query $query ) 
{
    // Nothing to do if backend or not home page or not the main query
    if ( is_admin() || ! $query->is_home() || ! $query->is_main_query() )
        return;

    // Get current pagination
    $paged = get_query_var( 'paged', 1 );

    // Modify sticky posts display
    $query->set( 'ignore_sticky_posts', true );

    // Modify post status
    $query->set( 'post_status', 'publish' );

    // Edit to your needs
    $pp_fp      = 13; // posts per first page
    $pp_op      = 10; // posts per other pages
    $offset_fp  = 0;  // offset for the first page

    // Offset for other pages than the first page
    $offset_op = ( $paged - 2 ) * $pp_op + $pp_fp + $offset_fp;

    // Modify offset
    $query->set( 'offset', $query->is_paged() ? $offset_op : $offset_fp );

    // Modify posts per page
    $query->set( 'posts_per_page', $query->is_paged() ? $pp_op : $pp_fp );  
} );

Hoffe, Sie können es an Ihre Bedürfnisse anpassen!

2
birgire

Ich würde es wahrscheinlich ohne die && !$query->is_paged() versuchen (Sie haben bereits 2 Bedingungen, die ausreichen sollten, sogar die erste sollte tatsächlich funktionieren) und wenn dies nicht funktioniert, versuchen Sie, den $paged -Wert auszugeben und zu sehen, wie Sie die Funktion besser optimieren können .

Einige Debug-Ideen:

// get current page we are on. If not set we can assume we are on page 1.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// are we on page one?
if(1 == $paged) {
    //true
}
0
The J