Pagination adicionando postagens extras somente na página 2

Depois de ficar tão perto de pregar meu tema, eu atingi o último obstáculo. Essencialmente, eu tenho três áreas diferentes na minha página inicial:

  1. A última publicação aparece no header e é denominada como uma publicação em destaque
  2. Duas postagens abaixo desse estilo como postagens recentes
  3. O resto das postagens (10) na data abaixo

A última publicação (1) e as duas postagens recentes (2) são mostradas usando um WP_Query personalizado e as dez postagens restantes (3) são mostradas usando o loop padrão com uma function de deslocamento que também resolve a paginação, MAS … há um soluço com página 2. Por algum motivo, está adicionando três posts extras ao topo da lista de postagens (3)? Depois disso, a página 3 em diante, está bem e funciona como deveria. Eu também devo mencionar que as postagens recentes e recentes (1 e 2) devem ser exibidas no topo em todos os momentos ao percorrer as páginas.

Aqui o layout com as diferentes áreas e números de publicação:

Layout

Aqui está o código usado para a function que controla as postagens principais (3) e a correção de paginação (o deslocamento é usado para ignorar as postagens recentes e recentes mostradas acima):

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

Qualquer ajuda seria excelente, pois esse é o último pedaço que me está tropeçando.

Obrigado 🙂

Solutions Collecting From Web of "Pagination adicionando postagens extras somente na página 2"

Aqui está uma sugestão para uma maneira geral de suportar diferentes número de postagens na página inicial do que nas outras páginas paginadas . Devemos usar a consulta principal em vez de sub-consultas , se possível.

Fórmula

Parece fazer sentido levar o deslocamento para páginas paginadas como:

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

onde paged ( pagination ), pp_fp ( posts per first page ), pp_op ( posts por outras páginas ) e offset_fp ( offset para a primeira página ) são números inteiros não negativos.

Para paged=1 o offset é offset_fp , senão é offset_op para outras páginas.

Exemplo 1:

Primeiro calculamos o deslocamento para poucas páginas para entender melhor isso:

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

Aqui está uma lista de índices de postagem em cada página:

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

Podemos ver que o deslocamento corresponde aos índices.

Exemplo # 2:

Vamos pegar pp_fp = 3 , pp_op = 5 , offset_fp=4 e calcular o offset_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 ... 

e compare com os índices:

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

Plug-in de demonstração

Aqui está uma implementação de demonstração:

 /** * 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 ); } ); 

Espero que você possa ajustá-lo às suas necessidades!

Provavelmente eu tentaria sem o && !$query->is_paged() (você já tem 2 condições que devem ser suficientes, mesmo que o primeiro deveria funcionar realmente) e se isso não funcionar, tente exibir o valor $paged $ e veja como você pode ajustar melhor a function.

Algumas idéias de debugging:

 // 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 }