web-dev-qa-db-fra.com

Cela ne devrait-il pas être facile?! Lien de type de message personnalisé/taxonomie personnalisée

Donc, cela me rend absolument fou. J'ai passé des jours à essayer de résoudre ce problème et je ne comprends pas pourquoi c'est si difficile, car il s'agit certainement d'une structure de lien permanent très commune!

J'ai parcouru des centaines de réponses et de messages et aucun d'eux ne semble résoudre le problème.

Je veux simplement cette structure:

mysite.com/custom-post-type/custom-taxonomy-term/post-name

Je réalise donc ce qui suit:

mysite.com/literature - all literature posts
mysite.com/literature/fiction - all literature posts with 'fiction' term
mysite.com/literature/fiction/mybook - the post

Chaque fois que j'essaie quelque chose, je reçois des erreurs 404 ou la pagnination ne fonctionne pas.

Je ne comprends pas pourquoi c'est si difficile!

Toute aide vraiment appréciée!

Je vous remercie

=============================================== ==== ================= INFORMATIONS SUPPLÉMENTAIRES ==================

J'enregistre actuellement le type de message et la taxonomie comme suit:

register_post_type('literature',$args);
'rewrite' => array('slug' => 'literature/books','with_front' => false),

register_taxonomy('literature_category',array('literature'), array(
'rewrite' => array( 'slug' => 'literature','with_front' => false ),

Si j'enregistre les deux en tant que "littérature", je reçois un 404 sur la page mysite.com/literature mais mon permalien est ainsi affiché: mysite.com/literature/books/mybook

Après avoir suivi les conseils relatifs à cette question - Types de messages personnalisés, taxonomies et permaliens

J'ai ajouté ceci à mes fonctions:

function filter_post_type_link($link, $post) {
    if ($post->post_type != 'literature')
        return $link;

    if ($cats = get_the_terms($post->ID, 'literature_category'))
        $link = str_replace('%literature_category%', array_pop($cats)->slug, $link);
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

Et changé mon type de message à 'slug' => 'literature/%literature_category%' Et changé ma taxonomie à 'slug' => 'literature'

Cela fonctionne très bien, sauf que sur mysite.com/literature, la pagination ne fonctionne pas, alors je reçois une erreur 404 sur l'URL suivante:

mysite.com/literature/page/2/

11
fxfuture

Suivez les conseils sur cette question comme vous l'avez déjà fait, mais ajoutez ceci à votre code:

add_action( 'generate_rewrite_rules', 'fix_literature_category_pagination' );
function fix_literature_category_pagination( $wp_rewrite ) {
    unset($wp_rewrite->rules['literature/([^/]+)/page/?([0-9]{1,})/?$']);
    $wp_rewrite->rules = array(
        'literature/?$' => $wp_rewrite->index . '?post_type=literature',
        'literature/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?post_type=literature&paged=' . $wp_rewrite->preg_index( 1 ),
        'literature/([^/]+)/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?literature_category=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
    ) + $wp_rewrite->rules;
}

Enfin, allez dans Paramètres> Permaliens et cliquez sur Enregistrer. Si cela ne fonctionne toujours pas, enregistrez à nouveau vos permaliens. Parfois, j'ai l'impression que vous devez les sauver deux fois, mais qui sait. Quoi qu'il en soit, laissez-moi savoir comment vous vous en sortez. Notez que la réponse n ° 1 de la science informatique s'applique: Ça marche pour moi ... ;-)

Du pays de TMI ...

Pour référence, la raison pourquoi _ les pages ne fonctionnent pas par défaut est que WordPress introduit une règle de réécriture pour la littérature /% literature_category% /% book% /% page%, ce qui est tout à fait logique si vous pensez à propos de ça. Donc, vos permaliens par défaut ont ces règles concurrentes dans cet ordre:

[literature/([^/]+)/([^/]+)(/[0-9]+)?/?$] => index.php?literature_category=$matches[1]&book=$matches[2]&page=$matches[3]
[literature/([^/]+)/page/?([0-9]{1,})/?$] => index.php?literature_category=$matches[1]&paged=$matches[2]

Tout ce que nous faisons ici consiste à changer l'ordre de ceux-ci en désactivant le dernier (nous pouvons le garder, mais chaque réécriture suivante a ensuite une expression rationnelle à exécuter lors du chargement de la page) et en l'ajoutant au début du tableau.

Fait amusant: Si vous avez déjà un "livre" intitulé "page" et qu'il comporte plusieurs pages, cet ordre entrera en conflit et les pages suivantes ne fonctionneront pas!

6
Matthew Boynes