Tipos de postagem personalizados, modelos de páginas e paginação. Por que recebo um erro 404?

2

Eu passei horas hoje em um problema enlouquecedor que estava tendo com a exibição de um tipo de postagem personalizado. Tudo exibido lindamente, exceto a paginação simplesmente não funcionaria corretamente.

Eu tenho uma configuração de modelo de página para exibir uma "página de postagens" (consulte Codex: Página de postagens ) para uma tipo de postagem personalizada ('news').

Continuo recebendo um erro 404 quando clico em "Posts mais antigos". Eu notei que muitas outras pessoas tiveram ou tiveram esse problema.

Por que isso está acontecendo? Aqui está minha consulta & código de loop:

<?php 
    // Enable Pagination
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    // The Args
    $args= array(
        'post_type' => 'news',
        'paged' => $paged,
        );

    // The Query
    query_posts($args); 

    // The Loop
    while ( have_posts() ) : the_post(); ?>
// ...
    
por timshutes 16.06.2012 / 08:14

3 respostas

5

Eu percebi esse problema literalmente segundos antes de postar a pergunta, então pensei em prosseguir e postar a resposta aqui. Eu notei que não há muita ajuda consolidada para esse problema.

Isso ajudará você se os links "Postagens mais antigas" ou "Postagens mais recentes" apresentarem um erro 404 ao tentar exibir postagens personalizadas em um modelo de página.

Aqui estão os passos para resolver o problema 404 (na maioria dos casos), se você está tendo. Verifique depois de cada um para ver se o problema desaparece.

Etapa 1: liberar seus permalinks

Vá para configurações = > permalinks. Selecione o padrão. Salve . Teste. Selecione sua preferência. Salve . Teste novamente.

Etapa 2: verifique sua consulta.

Se liberar os permalinks não corrigir o problema, verifique sua consulta. Use o Codex (consulte: Páginas > página de postagens ). Você precisa definir a variável $ paged e usá-la em suas opções de consulta.

Etapa 3: verifique se o seu posts_per_page não está em conflito com o padrão.

Há algumas pessoas discutindo isso como um bug no núcleo do wordpress. Seja esse o caso, a opção posts_per_page => x pode causar problemas com a paginação se x for menor que a opção padrão.

Uma solução hack-ish para esse problema é definir o padrão como 1 (configurações > leitura > "os blogs mostram no máximo _ páginas").

NOTA: Neste momento, eu ainda estava tendo o problema .. foi o passo 4 que finalmente consertou isso para mim.

Etapa 4: certifique-se de que seu slug de página! = seu post_type.

No meu caso, eu tinha post_type => 'news' . E a página que eu estava usando era www.meusite.com/news. Isso causou o conflito que acabou com a paginação. Para corrigir, mudei meu post_type para 'news-articles' e lavei novamente os permalinks. O problema foi embora.

Espero que isso ajude se você tiver o mesmo problema. Eu tenho a sensação de que muitas pessoas caem nessa armadilha - é fácil de fazer, e não é super intuitivo descobrir isso. (pelo menos não foi para mim).

    
por timshutes 16.06.2012 / 08:14
4

Sobre o Passo 3. Aqui está uma explicação porque isso acontece: "A paginação é calculada antes de você chegar ao arquivo de template que executa query_posts. A maneira correta de alterar posts_per_page condicionalmente é usar o gancho pre_get_posts para modificar a consulta principal." enlace Eu encontrei uma implementação "pre_get_posts" que funciona para mim enlace :

if ( ! function_exists( 'ucc_add_cpts_to_pre_get_posts' ) ) {
    function ucc_add_cpts_to_pre_get_posts( $query ) {
        if ( $query->is_main_query() && ! is_post_type_archive() && ! is_singular() && ! is_404() ) {
        $my_post_type = get_query_var( 'post_type' );
            if ( empty( $my_post_type ) ) {
                $args = array(
                    'exclude_from_search' => false,
                    'public' => true,
                    '_builtin' => false
                );
                $output = 'names';
                $operator = 'and';
                $post_types = get_post_types( $args, $output, $operator );

                // Or uncomment and edit to explicitly state which post types you want.
                // $post_types = array( 'event', 'location' );
                // Add 'link' and/or 'page' to array() if you want these included.
                // array( 'post', 'link', 'page' ), etc.
                $post_types = array_merge( $post_types, array( 'post' ) );
                $query->set('post_type', $post_types );
            }
        }
    } 
}

add_action( 'pre_get_posts', 'ucc_add_cpts_to_pre_get_posts' );
    
por Dmitry Misharov 16.06.2012 / 13:39
0

Eu vim com uma solução simples, depois de horas de pesquisa:)

Eu coloquei tudo bem no blog para quem deveria se deparar com esse problema :)

enlace

Espero que alguém tenha um pouco de alegria com isso:)

    
por Val 15.02.2013 / 20:48