Hanno un numero diverso di post sulla prima pagina


11

Devo avere un numero diverso di post per pagina sulla prima pagina rispetto alle altre pagine.

Ad esempio, questo è quello di cui ho bisogno

  • Messaggi totali: 6
  • Prima pagina: mostra 3 post
  • Pagina seguente: mostra 2 post per pagina

Ecco il mio codice:

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

Alla prima pagina in archivio, questo codice presuppone:

Bene, 6 post in totale e 3 post per pagina. Quindi ho bisogno di 2 pagine di archivio e l'impaginazione che vi presento è:

[1] [2]

Tuttavia, qualsiasi altra pagina dell'archivio presuppone che il codice:

Bene, 6 post in totale e 2 post per pagina. Quindi ho bisogno di 3 pagine di archivio e l'impaginazione che vi presento è:

[1] [2] [3]

Hai bisogno di un piccolo aiuto per risolvere questo problema.


Se solo potessi dire a WP_pagenavi quanti post alla 1a pagina e il resto ...
norixxx,

Perché esattamente hai bisogno di farlo in questo modo. Qualsiasi motivo particolare
Pieter Goosen,

Solo l'egoismo del mio cliente. In realtà non mi interessa se uso wp_pagenavi o no. Qualche altra tecnica che posso usare?
norixxx,

2
Innanzitutto 'caller_ get_ posts'contiene spazi e non è valido. Secondo, è deprecato. Usa ignore_sticky_postsinvece.
Kaiser

La tua home page, è una normale homepage o impostata come prima pagina
Pieter Goosen,

Risposte:


21

MODIFICA - RISPOSTA RISPOSTA

Sto lavorando a un'altra soluzione che in realtà è meglio la risposta originale. Ciò non comporta alcuna query personalizzata e penso che a tutti gli effetti la mia risposta originale possa essere eliminata ma conservata a scopo informativo

Credo ancora che tu sia nella home page e tratterò anche questo come tale. Quindi questa è la mia nuova soluzione

PASSO 1

Rimuovere la query personalizzata dalla home page e sostituirla con il ciclo predefinito

<?php

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

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

            endwhile;

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

            else : 

                //NO POSTS FOUND OR SOMETHING   

            endif; 

    ?>

PASSO 2

Utilizzare pre_get_postsper modificare la query principale per aggiungere la tassonomia personalizzata alla query principale da visualizzare nella home page.

PASSAGGIO 3

Ora, ottieni l' posts_per_pageopzione impostata dal back-end (che presumo sia 2) e imposta anche la tua offsetche useremo. Sarà 1come avrai bisogno di 3 post nella prima pagina e 2 nel resto

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

PASSAGGIO 4

Nella prima pagina, dovrai aggiungere il offsetto posts_per_pageaggiungerà fino a 3 per ottenere i tuoi tre post nella prima pagina.

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

PASSAGGIO 5

Devi applicare il tuo offseta tutte le pagine successive, altrimenti riceverai una ripetizione dell'ultimo post della pagina nella pagina successiva

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

PASSAGGIO 6

Infine, devi sottrarre il tuo offset da found_postsaltrimenti la tua impaginazione sull'ultima pagina sarà errata e ti darà un 404errore poiché l'ultimo post mancherà a causa del conteggio errato dei post

NOTA: questa parte di codice ha interrotto l'impaginazione sulla pagina di ricerca. Questo è ora risolto, vedi il codice aggiornato

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

TUTTI INSIEME

Ecco come apparirà la tua query completa che dovrebbe andare in Functions.php

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

3

So che risale a 1000 anni fa, ma un'altra soluzione per chiunque cerchi questa soluzione mentre utilizza una query personalizzata, ecco come farlo. In questo esempio la prima pagina ha richiesto 10 post e ogni pagina successiva ha bisogno di 9.

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

e quindi nell'array usare questo:

'posts_per_page' => $limit,

Ora sei a posto.


2
Questo non funzionerà. Con questo avrai il post # 10 visualizzato due volte. Da quando si accede alla seconda pagina "penserà" che anche alla prima pagina siano stati visualizzati 9 post e quindi inizierà a mostrare il post n. 10 sebbene sia già stato visualizzato nella prima pagina.
leymannx
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.