Pourquoi «/ page / 2 /» ne fonctionne pas?

11

Enfin, la pagination a fonctionné avec le code ci-dessous, mais maintenant la pagination est liée à / videos / page / 2 /, qui n'existe pas. Comment faire fonctionner la page 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
la source
Je ne recommanderais pas de remplacer la requête principale comme ça, avez-vous envisagé d'utiliser pre_get_posts? Ensuite, vous pouvez utiliser le code de pagination intégré plutôt que d'écrire le vôtre, et vous pouvez simplifier vers une boucle de publication standard
Tom J Nowell
En outre, WordPress fournit une page d'archive standard pour les types de publication, vous devriez donc déjà avoir une archive de publication à /videos/charger archive-videos.php, qui ne nécessite pas de déranger avec les requêtes
Tom J Nowell

Réponses:

15

Trouvé la réponse:

Après une longue journée de débogage via le noyau wordpress, j'ai réussi à résoudre ce problème.

Fondamentalement, vous CANT avez une PAGE et un TYPE DE POSTE PERSONNALISÉ avec le même nom. Si vous le faites, les règles de réécriture du permalien seront confuses et déclencheront un 404.

Une solution très simple que j'utilise est la suivante: La page qui répertorie les types de publication personnalisés est appelée au pluriel (par exemple, les produits) et le nom du type de publication est au singulier (par exemple, le produit). Donc, ils ne sont pas en conflit et tout va bien.

Fait fait! J'espère que cela fera gagner du temps aux gens.

Dave
la source
6
Je suppose que, pas seulement un article personnalisé, vous ne pouvez pas avoir un article et une page du même nom.
Rutwick Gangurde
4

Après un long moment, j'ai trouvé une solution à ce problème (grâce à franzblog ).

Si vous utilisez la version 4.2 ou supérieure, vous devez ajouter les lignes suivantes dans votre functions.phpfichier:

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; 
}

Tout fonctionne bien maintenant!

Dneiz
la source
1

vous POUVEZ avoir une PAGE et un TYPE DE POSTE PERSONNALISÉ avec le même nom

Il y a peut-être des années, c'était impossible, mais maintenant vous POUVEZ.

Tout d'abord, ajoutez ces lignes à $argsvotre type de publication:

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

Deuxièmement, dans l' functions.phpaction add:

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);
}

N'oubliez pas de vider les règles dans le tableau de bord.

ruorc
la source