Perché "/page/2/" non funziona?
Ho finalmente fatto funzionare la paginazione con il codice sottostante, ma ora i link di paginazione puntano a /videos/page/2/, che non esiste. Come posso far funzionare la pagina 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();
//visualizza contenuti
endwhile;
php wp_pagenavi();
?>

Trovata la risposta:
Dopo una lunghissima giornata di debug nel core di WordPress, sono riuscito a risolvere questo problema.
Fondamentalmente, NON PUOI avere una PAGINA e un CUSTOM POST TYPE con lo stesso nome. Se lo fai, le regole di riscrittura dei permalink si confondono e generano un errore 404.
Una soluzione molto semplice che sto usando è: la pagina che elenca i custom post type è chiamata al plurale (es. prodotti) e il nome effettivo del post type è al singolare (es. prodotto). In questo modo non entrano in conflitto e tutto funziona correttamente.
Fatto! Spero che questo farà risparmiare tempo a molte persone.

Immagino che non solo per i post personalizzati, ma non puoi avere nemmeno un post e una pagina con lo stesso nome.

Questo post mi ha aiutato. Non sono sicuro che sia esattamente lo stesso problema, ma rinominare la mia pagina da search/ a search-2 ha risolto un problema simile di paginazione. Suppongo di avere un conflitto nel mio tema con lo slug search/. Qualcuno può suggerire come confermarlo? Non trovo alcun riferimento a "search" in wp_posts - post_name.

Dopo molto tempo ho trovato una soluzione per questo problema (grazie a franzblog).
Se stai utilizzando la versione 4.2 o superiore, devi aggiungere le seguenti righe nel tuo file 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;
}
Ora tutto funziona correttamente!

NON PUOI avere una PAGINA e un CUSTOM POST TYPE con lo stesso nome
Forse tre anni fa era impossibile, ma ora PUOI.
Primo, aggiungi queste righe agli $args
del tuo post type:
'has_archive' => false,
'rewrite' => array(
'slug' => 'il-tuo-slug', // se hai bisogno dello slug
'with_front' => false,
),
Secondo, in functions.php
aggiungi l'azione:
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);
}
Non dimenticare di svuotare le regole di riscrittura nel pannello di controllo.

Una possibilità è che, nella dashboard di amministrazione Impostazioni -> Lettura
, se hai selezionato una Pagina articoli
, l'opzione Le pagine del blog mostrano al massimo
entrerà in conflitto con la tua query personalizzata posts_per_page
in quella pagina.
Quindi assicurati di deselezionare la pagina degli articoli o di far corrispondere il numero di articoli per pagina con l'opzione Le pagine del blog mostrano al massimo
in Impostazioni -> Lettura
.

Dopo aver eseguito il debug per molto tempo, ho finalmente trovato la soluzione riguardante il problema di paginazione
Fondamentalmente, in WordPress, non puoi avere una PAGINA e un TIPO DI POST PERSONALIZZATO con lo stesso nome. Se lo fai, le regole di riscrittura dei permalink si confonderanno e genereranno un errore 404.
