Tipos de publicaciones personalizadas, plantillas de página y paginación. ¿Por qué recibo un error 404?

2

Hoy he pasado horas en un tema enloquecedor que estaba teniendo al mostrar un tipo de publicación personalizada. Todo se muestra a la perfección, excepto que la paginación simplemente no funcionaría correctamente.

Tengo una configuración de plantilla de página para mostrar una "página de publicaciones" (consulte Codex: Página de publicaciones ) para obtener una Tipo de publicación personalizada ('noticias').

Sigo recibiendo un error 404 cuando hago clic en "Publicaciones anteriores". Noté que muchas otras personas tienen o tuvieron este problema.

¿Por qué sucede esto? Aquí está mi consulta & código de bucle:

<?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(); ?>
// ...
    
pregunta timshutes 16.06.2012 - 08:14

3 respuestas

5

Descubrí este problema literalmente segundos antes de publicar la pregunta, así que pensé en seguir adelante y publicar la respuesta aquí. Me he dado cuenta de que no hay mucha ayuda consolidada para este problema.

Esto te ayudará si tus enlaces "Publicaciones más antiguas" o "Publicaciones más nuevas" te dan un error 404 al intentar mostrar publicaciones personalizadas en una plantilla de página.

Aquí están los pasos para resolver el problema 404 (en la mayoría de los casos) si lo tiene. Comprueba después de cada uno para ver si el problema desaparece.

Paso 1: limpia tus enlaces permanentes

Ir a la configuración = > enlaces permanentes. Seleccione por defecto. Salvar. Prueba. Seleccione su preferencia. Salvar. Prueba de nuevo.

Paso 2: comprueba tu consulta

Si el lavado de los permalinks no soluciona el problema, revise la consulta. Use el Códice (consulte: Páginas > página de publicaciones ). Debe definir la variable $ paginada y usarla en sus opciones de consulta.

Paso 3: asegúrate de que posts_per_page no entre en conflicto con el valor predeterminado.

Hay algunas personas discutiendo esto como un error en el núcleo de wordpress. Sea o no ese el caso, la opción posts_per_page => x puede causar problemas con la paginación si x es menor que la opción predeterminada.

Una solución pirata para este problema es establecer el valor predeterminado en 1 (configuración > lectura > los "blogs se muestran como máximo _ páginas").

NOTA: En este punto, TODAVÍA tenía el problema ... fue el paso 4 el que finalmente lo resolvió para mí.

Paso 4: ¡Asegúrate de que tu barra de página! = tu tipo de publicación.

En mi caso, tuve post_type => 'news' . Y la página que estaba usando era www.mysite.com/news. Esto causó el conflicto que en última instancia torció la paginación. Para solucionarlo, cambié mi post_type a 'noticias-artículos' y volví a vaciar los enlaces permanentes. El problema desapareció.

Esperemos que esto te ayude si experimentas el mismo problema. Tengo la sensación de que mucha gente cae en esta trampa, es fácil de hacer y no es muy intuitivo de descifrar. (Al menos no fue para mí).

    
respondido por el timshutes 16.06.2012 - 08:14
4

Sobre el Paso 3. Aquí está la explicación de por qué sucede: "La paginación se calcula antes de llegar al archivo de plantilla que ejecuta query_posts. La forma correcta de alterar posts_per_page de manera condicional es usar el enlace pre_get_posts para modificar la consulta principal". enlace Encontré una implementación "pre_get_posts" que me funciona 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' );
    
respondido por el Dmitry Misharov 16.06.2012 - 13:39
0

He venido con una solución simple, después de horas de investigación :)

Lo pongo todo muy bien en el blog para cualquier persona que deba encontrar este problema :)

enlace

Espero que alguien obtenga algo de alegría :)

    
respondido por el Val 15.02.2013 - 20:48

Lea otras preguntas en las etiquetas