it-swarm.com.de

Haben unterschiedliche Anzahl von Beiträgen auf der ersten Seite

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

Zum Beispiel ist das, was ich brauche

  • Gesamte Beiträge: 6
  • Erste Seite: Zeige 3 Beiträge
  • Folgende Seite: Es werden 2 Beiträge pro Seite angezeigt

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();

Bei der ersten Seite im Archiv wird von folgendem Code ausgegangen:

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

[1] [2]

Für jede andere Seite im Archiv wird jedoch Folgendes vorausgesetzt:

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

[1] [2] [3]

Benötigen Sie eine kleine Hilfe, um dies zu beheben.

11
norixxx

BEARBEITEN - ANTWORT ÜBERARBEITET

Ich arbeite an einer anderen Lösung, die eigentlich die ursprüngliche Antwort besser ist. Hierbei handelt es sich nicht um eine benutzerdefinierte Abfrage, und ich denke, dass meine ursprüngliche Antwort für alle Zwecke verworfen, aber zu Informationszwecken aufbewahrt werden kann

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

SCHRITT 1

Entfernen Sie die benutzerdefinierte Abfrage von der Homepage 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_posts, um die Hauptabfrage zu ändern und Ihre benutzerdefinierte Taxonomie zur Hauptabfrage hinzuzufügen, die auf der Homepage angezeigt werden soll.

SCHRITT 3

Holen Sie sich jetzt den posts_per_page-Optionssatz aus dem Backend (ich nehme an, er ist 2) und stellen Sie auch Ihre offset ein, die wir verwenden werden. Das wird 1 sein, da Sie 3 Posts 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 die offset zu posts_per_page hinzufügen, um Ihre drei Beiträge auf Seite eins zu erhalten.

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

SCHRITT 5

Sie müssen Ihre offset auf alle nachfolgenden Seiten anwenden, andernfalls wird der letzte Beitrag der Seite auf der nächsten Seite wiederholt

$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 Versatz von found_posts subtrahieren, sonst ist Ihre Paginierung auf der letzten Seite falsch und Sie erhalten einen 404-Fehler, da der letzte Beitrag aufgrund der falschen Beitragsanzahl fehlt

HINWEIS: Dieser Code hat die Paginierung auf der Suchseite verletzt. Dies ist nun 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 aus, die in die Datei functions.php eingeht

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 );
19
Pieter Goosen

Ich weiß, dass dies vor 1000 Jahren war, aber eine andere Lösung für alle, die nach dieser Lösung suchen, während sie eine benutzerdefinierte Abfrage verwenden, ist die Vorgehensweise. 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.

3
Kiel Fleming