web-dev-qa-db-fra.com

Pourquoi "/ page/2 /" ne fonctionne-t-il pas?

Enfin, la pagination fonctionne avec le code ci-dessous, mais la pagination est maintenant 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();
 ?>
9
Dave

Trouvé la réponse:

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

En gros, vous POUVEZ avoir une PAGE et un TYPE CUSTOM POST _ avec le même nom. Si vous le faites, les règles de réécriture permalien deviendront 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, produits) et le nom du type de publication est au singulier (par exemple, 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.

13
Dave

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

Si vous utilisez la version 4.2 ou une version ultérieure, vous devez ajouter les lignes suivantes dans votre fichier 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; 
}

Tout fonctionne bien maintenant!

4
Dneiz

vous POUVEZ avoir une PAGE et un TYPE CUSTOM POST 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 à $args dans votre type de message:

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

Deuxièmement, dans functions.php, ajoutez l'action:

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 supprimer les règles dans le tableau de bord.

1
ruorc