Como mostrar uma única postagem na primeira página, mas com paginação normal?

9

Eu gostaria de ter uma única postagem na minha primeira página (sempre a mais recente), mas deixe a paginação normal funcionar. Portanto, a primeira página tem a postagem 1, a próxima página deve ter a mensagem 2-11 (1-10 também está bem), depois 12-21 ou 11-20, e assim por diante. Sei que posso alterar o número de postagens, dependendo do contexto , mas defini-lo como "1" na página inicial significa que as páginas adicionais também mostrarão apenas um post.

Meu principal problema é que /page/2/isso funciona, mas /page/1/sempre redireciona para a página inicial real /. Isso significa que as postagens 2 a 10 são sempre ignoradas, pois a página 2 mostra 11-20. I atualmente resolver isso ligando para o meu arquivo, mas isso não é ideal quando você vem para os primeiros posts do ano e há menos mensagens e nenhuma maneira óbvia de continuar.

Jan Fabry
fonte

Respostas:

7

Eu o resolvi usando o offsetparâmetro query . Isso me permitiu editar a consulta no pre_get_postsgancho 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 publicações de 2 a 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;
    }
}
Jan Fabry
fonte
Se isso funcionar, o OP deve usar isso.
john010117
O que eu faço, porque escrevi a pergunta e esta resposta. Mas obrigado por suas sugestões, elas me trouxeram o caminho certo.
Jan Fabry
Existe a possibilidade de fazê-lo funcionar em um archive.php ou category.php, mostrando apenas as 2 últimas postagens na página 1, mantendo a paginação correta? Obrigado!
Amit
@Mit: Se você substituir is_front_page()por is_archive()ou is_category(), acho que pode chegar onde precisa.
Jan Fabry
3

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.

  1. Criei uma nova página chamada home e coloquei meu texto de boas-vindas.
  2. Desativou a página inicial padrão e definiu minha página inicial personalizada como a página inicial
  3. Criou um novo modelo de página (copiado e modificado existente)
    1. deixe exibir o corpo da página
    2. carregar três postagens mais recentes da categoria X e exibi-las
    3. tenha um link "mais" abaixo, que vincula em / category / category-x /

fica assim: http://hinek.de (a página está em alemão, desculpe)

Se esse pode ser o caminho para você e você precisar de mais informações ou de um exemplo de código para o modelo de página, comente e eu editarei esta postagem.

Hinek
fonte
Isso funciona porque você só exibe postagens na categoria "Mensagem do ... tanto faz" e, portanto, pode ir para a página dessa categoria e usar a paginação normal. Quero mostrar postagens de todas as categorias, para que essa abordagem não funcione para mim. Você não tem um lugar onde as pessoas possam navegar por todas as postagens de todas as categorias?
Jan Fabry
1

Estou supondo que você esteja executando o Wordpress 3.0.x?

É fácil mostrar apenas uma postagem (em qualquer categoria) na primeira página. Use query_posts('post_per_page=1')no seu home.phparquivo em vez de chamar get_template_part('loop').

Seguir os métodos normais de paginação depois disso é um pouco complicado. No seu loop.phparquivo, sugiro colocar <?php global $paged; ?>antes da <?php if (have_posts()) : ?>instrução e usar a $pagedvariável e a query_posts()função para modificar sua consulta para que ela mostre as postagens corretas.

Seu loop.phparquivo seria algo 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 - 1simplesmente porque a página 2 mostrará as postagens 1 a 10 e a página 3 mostrará as postagens 11 a 20, e assim por diante.

john010117
fonte
Alterar o pagedparâmetro não interrompe mais nada, como o next_posts_link?. Talvez seja melhor modificar a consulta no pre_get_postsgancho, para não criar uma nova consulta? E sim, este é WP 3.
Jan Fabry
AFAIK, não deve afetar next_posts_link. A única maneira de descobrir é realmente tentar, é claro.
john010117
11
Argh, se eu tentar editar o pagedparâmetro no pre_get_postsgancho, redirect_canonicalentra em ação e deseja substituir o URL pelo novo pagedparâmetro. Posso desativar os redirecionamentos nesse caso, mas next_posts_linkusa uma $pagedvariável global que é definida como o novo valor, mas não sei por qual código, portanto, está incorreto.
Jan Fabry
Você realmente tentou usar meu código e ver se funciona? Eu não estou muito familiarizado com o pre_get_postsgancho, então não posso ajudar muito lá. Além disso, tente modificar a $pagedvariável diretamente (ex:) $paged = $paged - 1)se você estiver preocupado next_posts_link().
john010117
0

Essa pergunta é um pouco antiga, mas para quem a encontra 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. É ineficiente (executa novamente as consultas SQL) e falhará completamente em algumas circunstâncias (principalmente quando se lida com paginação de postagens).

...

TL; DR nunca use query_posts ();

Em vez disso, você deve usar o pre_get_postsgancho 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, lembre-se de que, em alguns casos (como ajustar compensações de postagem), usar um pre_get_postsgancho pode alterar sua paginação. Corrigir isso não é super difícil, mas é algo para estar ciente. Há um exemplo de como corrigir isso aqui .

lfalin
fonte