Eu gostaria de ter um único post na minha primeira página (sempre o mais recente), mas deixe o trabalho normal de paginação. Então, a primeira página tem post 1, a próxima página deve ter 2-11 (1-10 é bom também), depois 12-21 ou 11-20, e assim por diante. Eu sei que posso alterar o número de postagens dependendo do contexto , mas definir isso como "1" na página inicial significa que as outras páginas também mostram apenas uma postagem.
Meu principal problema é que /page/2/
e assim por diante funciona, mas /page/1/
sempre redireciona para a home page real, /
. Isso significa que as postagens 2-10 são sempre ignoradas, pois a página 2 mostra 11-20. Eu atualmente resolvo isso ligando ao meu arquivo, mas isso não é ideal quando você vem para os primeiros posts do ano e há menos posts e nenhuma maneira óbvia de continuar.
Eu resolvi usando o parâmetro de consulta offset
. Isso me permitiu editar a consulta no gancho pre_get_posts
e parece ser a maneira mais limpa de fazer isso, sem uma nova consulta. Agora a página inicial mostra apenas uma postagem e page/2/
mostra as postagens de 2-11. Todos os links continuam funcionando, nenhuma outra modificação é necessária.
add_action('pre_get_posts', 'set_offset_on_front_page');
function _set_offset_on_front_page(&$query)
{
if (is_front_page() && is_paged()) {
$posts_per_page = isset($query->query_vars['posts_per_page']) ? $query->query_vars['posts_per_page'] : get_option('posts_per_page');
// If you want to use 'offset', set it to something that passes empty()
// 0 will not work, but adding 0.1 does (it gets normalized via absint())
// I use + 1, so it ignores the first post that is already on the front page
$query->query_vars['offset'] = (($query->query_vars['paged'] - 2) * $posts_per_page) + 1;
}
}
Ok, talvez essa seja uma maneira estranha ou complicada de fazer isso, mas eu tive um problema semelhante (eu queria exibir um texto de boas-vindas e os três posts mais recentes de uma categoria específica na primeira página. Então eu fiz:
se parece com isso: http://hinek.de (a página está em alemão, desculpe)
Se este puder ser o caminho para você e você precisar de mais informações ou um exemplo de código para o modelo de página, comente e eu editarei esta postagem.
Eu estou supondo que você está executando o Wordpress 3.0.x?
Mostrar apenas um post (em qualquer categoria) na primeira página é fácil. Use query_posts('post_per_page=1')
no seu arquivo home.php
em vez de invocar get_template_part('loop')
.
Seguir os métodos normais de paginação depois disso é um pouco complicado. No seu arquivo loop.php
, sugiro colocar <?php global $paged; ?>
antes da instrução <?php if (have_posts()) : ?>
, e usar as variáveis $paged
e query_posts()
para modificar sua consulta para mostrar as postagens corretas.
Seu arquivo loop.php
seria parecido com isto (nota: não testado):
<?php
global $paged;
if (!is_front_page() && $paged && $post->post_type == 'post') :
query_posts('posts_per_page=10&paged=' . ($paged - 1));
if (have_posts()) :
while (have_posts()) : the_post();
// Rest of the loop
endwhile;
endif;
endif;
?>
Eu usei $paged - 1
simplesmente porque a página 2 mostrará as postagens de 1 a 10, e a página 3 mostrará as postagens de 11 a 20 e assim por diante.
Esta questão é um pouco antiga, mas para aqueles que encontram isso na era moderna, você nunca deve chamar query_posts . Do códice do Wordpress:
query_posts () é uma maneira excessivamente simplista e problemática de modificar a consulta principal de uma página, substituindo-a por uma nova instância da consulta. Ele é ineficiente (executa consultas SQL) e falhará em algumas circunstâncias (especialmente quando se trata de paginação de postagens).
...
TL; DR não usa query_posts () ever;
Em vez disso, você deve usar o gancho pre_get_posts
em functions.php da seguinte maneira:
function hwl_home_pagesize( $query ) {
// Behave normally for secondary queries
if ( is_admin() || ! $query->is_main_query() )
return;
if ( is_home() ) {
// Display only 1 post for the home page
$query->set( 'posts_per_page', 1 );
return;
}
// Otherwise, use whatever is set in the Wordpress Admin screen
$query->set( 'posts_per_page', get_option('posts_per_page'); );
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );
No entanto, tenha em atenção que, em alguns casos, (como ajustar as compensações posteriores), utilizar um gancho pre_get_posts
pode mangle a sua paginação. Consertar isso não é muito difícil, mas é algo que você deve estar ciente. Há um exemplo de como consertar isso aqui .