Mostrar um número diferente de postagens por página, dependendo do contexto (por exemplo, página inicial, pesquisa, arquivo)

21

Nas Configurações de leitura, há um local para definir o número de postagens mostradas que afeta o número de postagens exibidas em todos os contextos. Em vez disso, gostaria de mostrar um certo número de postagens na página inicial e um número diferente de postagens em páginas como arquivo, resultados de pesquisa etc.

ler-configurações-blog-páginas-mostrar-no-máximo-por-página

Sei que posso fazer isso editando os arquivos de tema e alterando os parâmetros de consulta, mas prefiro ter acesso mais fácil a uma página de configurações simples. Há muito tempo, deparei-me com um plugin que fazia isso, mas não consigo localizá-lo agora.

Alguém sabe de um plugin para fazer isso, ou mesmo uma função que eu poderia colocar em functions.php para realizar a mesma coisa?

Doug
fonte
Você provavelmente estava pensando no plugin 'Posts diferentes por página' do chip-bennett: chipbennett.net/plugins/cbnet-different-posts-per-page, que faz o que você deseja de maneira gráfica.
Tom Auger

Respostas:

23

Acredito que a melhor maneira de fazer isso em um plug-in é executar a seguinte função de exemplo quando o pre_get_postsgancho de ação for encontrado. O $wp_queryobjeto está disponível, o que significa que suas tags condicionais estão disponíveis, mas antes que o WordPress obtenha as postagens, o que significa que você está alterando os vars de consulta antes da execução da primeira consulta, em vez de adicionar uma segunda consulta, como quando query_posts () é usado em um tema Arquivo.

function custom_posts_per_page($query) {
    if (is_home()) {
        $query->set('posts_per_page', 8);
    }
    if (is_search()) {
        $query->set('posts_per_page', -1);
    }
    if (is_archive()) {
        $query->set('posts_per_page', 25);
    } //endif
} //function

//this adds the function above to the 'pre_get_posts' action     
add_action('pre_get_posts', 'custom_posts_per_page');
kevtrout
fonte
Eu uso essa função no meu próprio site. Foi fácil recortar e colar aqui para você.
Kevtrout 12/08/10
0

você pode fazer um loop personalizado usando query_posts e especificar o número de postagens de is_home, is_archive etc.

apenas uma instrução if simples, juntamente com query_posts

chrismccoy
fonte
Sim, eu mencionei isso na minha pergunta. Estou procurando uma maneira de fazer isso, para não precisar editar vários arquivos de tema para alterar as configurações. Obrigado.
Doug
1
É uma péssima idéia fazer dessa maneira. O WordPress já executa a consulta. Se você inserir query_postsseu tema, ignorará a consulta original e fará outra redundante.
Krzysiek Dróżdż
-1

Para adicionar a esta pergunta. Alguém sabe como determinar post_per_page para esta função function custom_posts_per_page ($ query) se adicionar a nova página ao index.php assim:

<?php
if ($_GET['new'] == 1) 
{
    include ( TEMPLATEPATH . '/newpage.php' );
    exit;
}
?>
glazsasha
fonte
-1

Sei que posso fazer isso editando os arquivos de temas e alterando os parâmetros de consulta, mas prefiro ter acesso mais fácil a uma página de configurações simples.

No interesse da integridade, descobri que query_postscombinado com $query_stringconcatenação funciona bem.

Coloquei esse código index.php(meu tema não tem category.php) ...

<?php 
if (!is_front_page()) { 
    query_posts($query_string . "&posts_per_page=20"); 
}
?>

Obviamente, o que estamos fazendo aqui é modificar a string de consulta interna do loop, substituindo o número padrão de postagens por página .

É uma delícia fornecer uma lista menor de postagens na página inicial, onde estou mostrando postagens completas, e uma lista muito maior de postagens em qualquer outro lugar (categorias, por data, etc.), onde apenas mostro resumos de postagens.

No entanto, observe que, diferentemente da resposta aceita, a consulta será executada duas vezes , portanto, não é uma solução tão boa.

Jeff Atwood
fonte
Jeff, eu estava procurando um local centralizado para controlar o número de postagens retornadas em diferentes contextos. Sua resposta só o faz se você usar o index.php para lidar com TODOS os contextos, o que a maioria dos temas não faz. Além de aumentar as chamadas para o banco de dados (o que afeta o desempenho), sua técnica também pode alterar a resposta às tags condicionais (por exemplo, is_home () ou is_front_page) de maneiras inesperadas. Por fim, se você deseja adicionar loops secundários a uma página, NÃO deve usar query_posts, mas use "new WP_Query" (ou get_posts).
Doug
@ Doug, este não é um loop secundário, está substituindo o loop principal - e sim, esse tema em particular usa index.php para renderizar tudo, é bastante minimalista. Eu senti que isso fazia mais sentido aqui como resposta, mas se você quiser, posso fazer minha própria pergunta e respondê-la se essa resposta o ofender de alguma forma.
91111 Jeff Atwood
Na verdade, eu li mal o penúltimo parágrafo e pensei que as listas "maiores" e "menores" estavam na mesma página, então minha última frase acima era irrelevante. E sim, é perfeitamente legítimo colocar todo o seu código em index.php, se quiser. E se for esse o caso, seu método é uma maneira rápida e fácil de fazer isso, então removerei meu voto negativo após o bloqueio de 20 horas. Mesmo assim, enviar uma nova consulta em vez de modificar a consulta original, como na resposta do kevtrout, é menos desejável pelos motivos já mencionados (por você, eu e o WP Codex).
Doug