¿Por qué "/ page / 2 /" no funciona?

11

Finalmente conseguí que la paginación funcione con el siguiente código, pero ahora la paginación se vincula a / videos / page / 2 /, que no existe. ¿Cómo hago para que funcione la página 2?

<?php
$temp = $wp_query;
$wp_query= null;
$wp_query = new WP_Query();
$wp_query->query('post_type=videos&showposts=1'.'&paged='.$paged);

while ($wp_query->have_posts()) : $wp_query->the_post();
  //display stuff
endwhile;           

php  wp_pagenavi();
 ?>
Dave
fuente
No recomendaría anular la consulta principal de esa manera, ¿ha considerado usar pre_get_posts? Luego puede usar el código de paginación incorporado en lugar de escribir el suyo, y puede simplificarlo a un bucle de publicación estándar
Tom J Nowell
Además, WordPress proporciona una página de archivo estándar para los tipos de publicación, por lo que ya debería tener un archivo de publicación /videos/que se cargará archive-videos.php, que no requiere perder el tiempo con las consultas
Tom J Nowell

Respuestas:

15

Encontró la respuesta:

Después de un largo día de depuración a través de WordPress Core, logré resolver este problema.

Básicamente, NO PUEDES tener una PÁGINA y un TIPO DE PUBLICACIÓN PERSONALIZADA con el mismo nombre. Si lo hace, las reglas de reescritura de enlaces permanentes se confundirán y desencadenarán un 404.

Una solución muy simple que estoy usando es: la página que enumera los tipos de publicaciones personalizadas se llama en plural (por ejemplo, productos) y el nombre del tipo de publicación real está en singular (por ejemplo, producto). Entonces no entran en conflicto y todo está bien.

¡Hecho hecho! Espero que esto ahorre tiempo a la gente.

Dave
fuente
66
Supongo que no solo una publicación personalizada, no puede tener una publicación y una página con el mismo nombre también.
Rutwick Gangurde
4

Después de mucho tiempo encontré una solución para este problema (gracias a franzblog ).

Si está utilizando la versión 4.2 o superior, debe agregar las siguientes líneas en su functions.phparchivo:

add_filter( 'redirect_canonical', 'custom_disable_redirect_canonical' );
function custom_disable_redirect_canonical( $redirect_url ) {
    if ( is_paged() && is_singular() ) $redirect_url = false; 
    return $redirect_url; 
}

¡Todo está funcionando bien ahora!

Dneiz
fuente
1

NO PUEDES tener una PÁGINA y un TIPO DE PUBLICACIÓN PERSONALIZADA con el mismo nombre

Quizás el árbol hace años era imposible, pero ahora PUEDES.

Primero, agregue estas líneas a $argssu tipo de publicación:

'has_archive' => false,
'rewrite'     => array(
                 'slug'       => 'your slug', // if you need slug
                 'with_front' => false,
                 ),

En segundo lugar, en functions.phpagregar acción:

add_action('init', 'custom_rewrite_basic');
function custom_rewrite_basic() {
    global $wp_post_types;
    foreach ($wp_post_types as $wp_post_type) {
        if ($wp_post_type->_builtin) continue;
        if (!$wp_post_type->has_archive && isset($wp_post_type->rewrite) && isset($wp_post_type->rewrite['with_front']) && !$wp_post_type->rewrite['with_front']) {
            $slug = (isset($wp_post_type->rewrite['slug']) ? $wp_post_type->rewrite['slug'] : $wp_post_type->name);
            $page = get_page_by_slug($slug);
            if ($page) add_rewrite_rule('^' .$slug .'/page/([0-9]+)/?', 'index.php?page_id=' .$page->ID .'&paged=$matches[1]', 'top');
        }
    }
}

function get_page_by_slug($page_slug, $output = OBJECT, $post_type = 'page' ) {
    global $wpdb;

    $page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s AND post_status = 'publish'", $page_slug, $post_type ) );

    return ($page ? get_post($page, $output) : NULL);
}

No olvides eliminar las reglas en el tablero.

ruorc
fuente