web-development-kb-pt.site

Como mostrar um único post na primeira página, mas tem paginação normal?

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.

8
Jan Fabry

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;
    }
}
6
Jan Fabry

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:

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

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.

3
Hinek

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.

1
john010117

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 .

0
lfalin