¿Por qué "/page/2/" no funciona?
Finalmente logré que la paginación funcione con el código siguiente, pero ahora los enlaces de paginación dirigen a /videos/page/2/, que no existe. ¿Cómo puedo hacer que la página 2 funcione?
<?php
// Almacenar la consulta actual
$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();
// mostrar contenido
endwhile;
php wp_pagenavi();
?>

Encontré la respuesta:
Después de un largo día depurando el núcleo de WordPress, logré resolver este problema.
Básicamente, NO PUEDES tener una PÁGINA y un TIPO DE ENTRADA PERSONALIZADO con el mismo nombre. Si lo haces, las reglas de reescritura de enlaces permanentes se confundirán y generarán un error 404.
Una solución muy simple que estoy usando es: La página que lista los tipos de entradas personalizadas se llama en plural (ej. productos) y el nombre real del tipo de entrada está en singular (ej. producto). Así no entran en conflicto y todo funciona bien.
¡Listo! Espero que esto ahorre tiempo a otras personas.

Supongo que no solo con publicaciones personalizadas, tampoco puedes tener una publicación y una página con el mismo nombre.

No tengo idea de qué significa esto... ¡Pero sé que es la solución!

Esta publicación me ayudó. No estoy seguro si es exactamente el mismo problema, pero cambiar el nombre de mi página de search/ a search-2 resolvió un problema similar de paginación. Supongo que tengo un conflicto en mi tema con el slug search/. ¿Alguien aquí puede sugerir cómo confirmar eso? No encuentro ninguna referencia a "search" en wp_posts - post_name.

Después de mucho tiempo encontré una solución para este problema (gracias a franzblog).
Si estás usando la versión 4.2 o superior, necesitas agregar las siguientes líneas en tu archivo functions.php
:
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;
}
¡Ahora todo funciona correctamente!

NO PUEDES tener una PÁGINA y un TIPO DE POST PERSONALIZADO con el mismo nombre
Tal vez hace tres años era imposible, pero ahora SÍ PUEDES.
Primero, añade estas líneas a $args
en tu tipo de post:
'has_archive' => false,
'rewrite' => array(
'slug' => 'tu-slug', // si necesitas un slug
'with_front' => false,
),
Segundo, en functions.php
añade la 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 limpiar las reglas en el panel de control.

Una posibilidad es que, en el panel de administración Ajustes -> Lectura
, si has seleccionado una Página de entradas
, la opción Las páginas de blog muestran como máximo
entrará en conflicto con tu consulta personalizada posts_per_page
en esa página.
Así que asegúrate de que o bien deseleccionas la página de entradas, o te aseguras de que las entradas por página coincidan con la opción Las páginas de blog muestran como máximo
en Ajustes -> Lectura
.

Después de depurar durante mucho tiempo, finalmente encontré la solución al problema de paginación
Básicamente, en WordPress, no puedes tener una PÁGINA y un TIPO DE ENTRADA PERSONALIZADO (Custom Post Type) con el mismo nombre. Si lo haces, las reglas de reescritura de enlaces permanentes se confundirán y generarán un error 404.
