Haben Sie unterschiedliche Anzahl von Beiträgen auf der ersten Seite

11

Ich muss auf der ersten Seite eine andere Anzahl von Posts pro Seite haben als auf den anderen Seiten.

Zum Beispiel ist es das, was ich brauche

  • Beiträge insgesamt: 6
  • Erste Seite: zeigt 3 Beiträge
  • Folgende Seite: zeigt 2 Beiträge pro Seite

Hier ist mein Code:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$fp_limit = 3; // first page limit
$limit = 2; // following page limit
$offset = 0; // default offset

if( $paged == 1 ) {
    $limit = $fp_limit;
} else {
    $offset = $fp_limit + ( ($paged - 2) * $limit );
}

$args = array(
    'post_type' => 'my_post_type',
    'post_status' => 'publish',
    'offset' => $offset,
    'posts_per_page' => $limit,
    'caller_ get_ posts' => -1, // remove sticky post
    'paged' => $paged,
    'tax_query' => array(
        array(
            'taxonomy' => 'my_taxo',
            'field' => 'slug',
            'terms' => array('slug1', 'slug2', 'slug3')
        )
    )
);
$my_query = null;
$my_query = new WP_Query($args);

// basic loop
if( $my_query->have_posts() ) : 
while ($my_query->have_posts()) : $my_query->the_post();

...

endwhile; endif; // archive loop
if (function_exists('wp_pagenavi')){ wp_pagenavi( array( 'query' => $my_query ) ); }

wp_reset_query();

Auf der ersten Seite des Archivs setzt dieser Code Folgendes voraus:

Nun, insgesamt 6 Beiträge und 3 Beiträge pro Seite. Ich brauche also 2 Archivseiten und die Paginierung, die ich Ihnen präsentiere, ist:

[1] [2]

Bei jeder anderen Seite im Archiv geht der Code jedoch davon aus:

Nun, insgesamt 6 Beiträge und 2 Beiträge pro Seite. Ich brauche also 3 Archivseiten und die Paginierung, die ich Ihnen präsentiere, ist:

[1] [2] [3]

Benötigen Sie ein wenig Hilfe, um dies zu beheben.

norixxx
quelle
Wenn ich nur WP_pagenavi sagen könnte, wie viele Beiträge auf der 1. Seite und dem Rest ...
norixxx
Warum genau müssen Sie das so machen? Ein besonderer Grund
Pieter Goosen
Nur die Selbstsucht meines Klienten. Es ist mir eigentlich egal, ob ich wp_pagenavi benutze oder nicht. Irgendeine andere Technik, die ich verwenden kann?
Norixxx
2
Zunächst einmal 'caller_ get_ posts'enthält Leerzeichen und ist nicht gültig. Zweitens ist es veraltet. Verwenden Sie ignore_sticky_postsstattdessen.
Kaiser
Ihre Homepage, ist es eine normale Homepage oder als Titelseite festgelegt
Pieter Goosen

Antworten:

21

BEARBEITEN - ANTWORT ÜBERARBEITET

Ich arbeite an einer anderen Lösung, die eigentlich besser ist als die ursprüngliche Antwort. Dies beinhaltet keine benutzerdefinierte Abfrage und ich denke, dass meine ursprüngliche Antwort für alle Zwecke gelöscht, aber zu Informationszwecken aufbewahrt werden kann

Ich glaube immer noch, dass Sie auf der Homepage sind und dies auch als solche behandeln werden. Das ist also meine neue Lösung

SCHRITT 1

Entfernen Sie die benutzerdefinierte Abfrage von der Startseite und ersetzen Sie sie durch die Standardschleife

<?php

        if ( have_posts() ) :
            // Start the Loop.
            while ( have_posts() ) : the_post();

                ///<---YOUR LOOP--->

            endwhile;

                //<---YOUR PAGINATION--->   

            else : 

                //NO POSTS FOUND OR SOMETHING   

            endif; 

    ?>

SCHRITT 2

Verwenden Sie pre_get_postsdiese Option, um die Hauptabfrage zu ändern und Ihre benutzerdefinierte Taxonomie zur Hauptabfrage hinzuzufügen, die auf der Startseite angezeigt werden soll.

SCHRITT 3

Holen Sie sich jetzt den posts_per_pageOptionssatz vom Backend (von dem ich annehme, dass er 2 ist) und legen Sie auch Ihren fest, offsetden wir verwenden werden. Das wird sein, 1da Sie 3 Beiträge auf Seite eins und 2 auf dem Rest benötigen

$ppg = get_option('posts_per_page');
$offset = 1;

SCHRITT 4

Auf Seite eins müssen Sie das hinzufügen offset, posts_per_pageum bis zu 3 zu addieren, damit Ihre drei Beiträge auf Seite eins angezeigt werden.

$query->set('posts_per_page', $offset + $ppp);

SCHRITT 5

Sie müssen Ihre offsetauf alle nachfolgenden Seiten anwenden , andernfalls erhalten Sie eine Wiederholung des letzten Beitrags der Seite auf der nächsten Seite

$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset); 

SCHRITT 6

Zuletzt müssen Sie Ihren Offset von dem subtrahieren, da found_postssonst Ihre Paginierung auf der letzten Seite falsch ist und Sie einen 404Fehler erhalten, da der letzte Beitrag aufgrund der falschen Anzahl der Beiträge fehlt

HINWEIS: Dieser Code hat die Paginierung auf der Suchseite unterbrochen. Dies ist jetzt behoben, siehe den aktualisierten Code

function homepage_offset_pagination( $found_posts, $query ) {
    $offset = 1;

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts - $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );

ALLE ZUSAMMEN

So sieht Ihre vollständige Abfrage in der Datei functions.php aus

function tax_and_offset_homepage( $query ) {
  if ($query->is_home() && $query->is_main_query() && !is_admin()) {
    $query->set( 'post_type', 'my_post_type' );
    $query->set( 'post_status', 'publish' );
    $query->set( 'ignore_sticky_posts', '-1' );
    $tax_query = array(
        array(
            'taxonomy' => 'my_taxo',
            'field' => 'slug',
            'terms' => array('slug1', 'slug2', 'slug3')
        )
    );
    $query->set( 'tax_query', $tax_query );
    $ppp = get_option('posts_per_page');
    $offset = 1;
    if (!$query->is_paged()) {
      $query->set('posts_per_page',$offset + $ppp);
    } else {
      $offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
      $query->set('posts_per_page',$ppp);
      $query->set('offset',$offset);
    }
  }
}
add_action('pre_get_posts','tax_and_offset_homepage');

function homepage_offset_pagination( $found_posts, $query ) {
    $offset = 1;

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts - $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );
Pieter Goosen
quelle
3

Ich weiß, dass dies von vor 1000 Jahren ist, aber eine andere Lösung für alle anderen, die nach dieser Lösung suchen, während sie eine benutzerdefinierte Abfrage verwenden, ist hier, wie es geht. In diesem Beispiel benötigte die 1. Seite 10 Beiträge und jede nachfolgende Seite 9.

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
if( $paged == 1 ) {
   $limit = 10;
} else {
   $limit = 9;
}

und dann im Array Folgendes verwenden:

'posts_per_page' => $limit,

Jetzt können Sie loslegen.

Kiel Fleming
quelle
2
Das wird nicht funktionieren. Damit wird Beitrag Nr. 10 zweimal angezeigt. Da beim Aufrufen der zweiten Seite "gedacht" wird, dass auf der ersten Seite auch 9 Beiträge angezeigt wurden, wird daher Beitrag Nr. 10 angezeigt, obwohl er bereits auf der ersten Seite angezeigt wurde.
Leymannx