Tem um número diferente de postagens na primeira página

11

Preciso ter uma quantidade diferente de postagens por página na primeira página e nas outras páginas.

Por exemplo, é disso que eu preciso

  • Total de mensagens: 6
  • Primeira página: mostrando 3 posts
  • Página seguinte: mostrando 2 postagens por página

Aqui está o meu código:

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

Na primeira página do arquivo, esse código pressupõe:

Bem, 6 posts no total e 3 posts por página. Então, eu preciso de 2 páginas de arquivo e a paginação que apresento a você é:

[1] [2]

No entanto, qualquer outra página no arquivo que o código assume:

Bem, 6 posts no total e 2 posts por página. Então, eu preciso de 3 páginas de arquivo e a paginação que apresento a você é:

[1] [2] [3]

Precisa de uma ajudinha para consertar isso.

norixxx
fonte
Se ao menos eu pudesse dizer ao WP_pagenavi quantas postagens na 1ª página e no restante ...
norixxx 25/07/14
Por que exatamente você precisa fazer dessa maneira? Qualquer motivo em particular
Pieter Goosen
Apenas o egoísmo do meu cliente. Na verdade, eu não me importo se eu uso wp_pagenavi ou não. Alguma outra técnica que eu possa usar?
Norixxx
2
Primeiro, 'caller_ get_ posts'contém espaços e não é válido. Segundo, está obsoleto. Use em ignore_sticky_postsvez disso.
Kaiser
Sua home page, é uma homepage normal ou conjunto como uma página da frente
Pieter Goosen

Respostas:

21

EDITAR - RESPOSTA REVISTA

Estou trabalhando em outra solução que é realmente melhor a resposta original. Isso não envolve nenhuma consulta personalizada e, para todos os fins, minha resposta original pode ser descartada, mas mantida para fins informativos.

Ainda acredito que você está na página inicial e também tratará isso como tal. Então esta é minha nova solução

PASSO 1

Remova a consulta personalizada da página inicial e substitua-a pelo loop padrão

<?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

Use pre_get_postspara alterar a consulta principal e adicionar sua taxonomia personalizada à consulta principal a ser exibida na página inicial.

ETAPA 3

Agora, pegue a posts_per_pageopção definida no back-end (que eu assumo é 2) e também defina a sua offsetque vamos usar. Será 1como você precisará de 3 postagens na página um e 2 no restante

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

PASSO 4

Na página um, você precisará adicionar o offsetao posts_per_pageadicionará até 3 para obter suas três postagens na página um.

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

PASSO 5

Você deve aplicá-lo offseta todas as páginas subseqüentes, caso contrário, você repetirá o último post da página na próxima página

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

PASSO 6

Por fim, você precisa subtrair seu deslocamento de found_postsoutra forma, sua paginação na última página estará incorreta e ocorrerá um 404erro, pois a última postagem estará ausente devido à contagem incorreta de postagens

NOTA: Este trecho de código quebrou a paginação na página de pesquisa. Agora está corrigido, veja o código atualizado

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

TODOS JUNTOS

É assim que sua consulta completa se parecerá com a que deve entrar em 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 );
Pieter Goosen
fonte
3

Eu sei que isso é de 1000 anos atrás, mas outra solução para quem procura essa solução enquanto usa uma consulta personalizada, aqui está como fazê-lo. Neste exemplo, a 1ª página precisava de 10 postagens e cada página subsequente, 9.

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

e, em seguida, na matriz, use este:

'posts_per_page' => $limit,

Agora você está pronto para ir.

Kiel Fleming
fonte
2
Isso não vai funcionar. Com isso, o post 10 será exibido duas vezes. Como ao acessar a segunda página, ela "pensará" que a primeira página também teve 9 postagens exibidas e, portanto, começará a mostrar a postagem nº 10, embora já tenha sido exibida na primeira página.
Leymannx # 9/19