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

8

Eu gostaria de ter um único post na minha página inicial (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 altere 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 página inicial real, / . Isso significa que as postagens 2-10 são sempre ignoradas, já que a página 2 mostra 11-20. Eu 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 posts e nenhuma maneira óbvia de continuar.

    
por Jan Fabry 12.08.2010 / 11:46

4 respostas

6

Eu resolvi o problema 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/ exibe postagens 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;
    }
}
    
por Jan Fabry 12.08.2010 / 18:17
3

Ok, talvez essa seja uma maneira estranha ou complicada de fazer isso, mas eu tive um problema semelhante (queria exibir um texto de boas-vindas e as três postagens 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. Criaram um novo modelo de página (copiou e modificou um existente)
    1. mostre o corpo da página
    2. carregue três postagens mais novas da categoria X e exiba-as
    3. tem um link "mais" abaixo que vincula em / category / category-x /

tem esta aparência: enlace (a página está em alemão, desculpe)

Se esse puder ser o caminho para você e você precisar de mais infos ou um exemplo de código para o modelo de página, comente e editei esta postagem.

    
por Hinek 12.08.2010 / 12:18
1

Estou assumindo que você está executando o Wordpress 3.0.x?

Para mostrar apenas uma postagem (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 a função $paged e query_posts() para modificar sua consulta para exibir as postagens corretas.

Seu arquivo loop.php seria algo como 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.

    
por john010117 12.08.2010 / 16:26
0

Esta pergunta é um pouco antiga, mas para aqueles que encontram isso na era moderna, você nunca deve ligar para query_posts . Do códice do Wordpress:

  

query_posts () é uma maneira excessivamente simplista e problemática de modificar   consulta de uma página, substituindo-a por uma nova instância da consulta. Isto é   ineficiente (re-executa consultas SQL) e falhará em alguns   circunstâncias (especialmente quando se trata de paginação posts).

     

...

     

TL; DR não usa query_posts () ever;

Em vez disso, você deve usar o pre_get_posts hook em functions.php da seguinte forma:

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, (tal como ajustar as compensações pós), a utilização de um pre_get_posts hook pode mangle a sua paginação. Consertar isso não é muito difícil, mas é algo para se ter consciência. Há um exemplo de como corrigir isso aqui .

    
por lfalin 10.12.2013 / 19:47