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

11

Donc cela me rend absolument fou. J'ai passé des jours à essayer de résoudre ce problème et je ne peux pas comprendre pourquoi c'est si difficile car il s'agit sûrement d'une structure de permalien très courante!

J'ai regardé 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, j'obtiens 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 COMPLÉMENTAIRES ==================

Actuellement, j'enregistre 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», j'obtiens un 404 sur la page mysite.com/literature mais cela affiche mon permalien comme: mysite.com/literature/books/mybook

Après avoir suivi les conseils sur cette question - Types de publication 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 en 'slug' => 'literature/%literature_category%' Et changé ma taxonomie en'slug' => 'literature'

Cela fonctionne très bien, sauf que la mysite.com/literaturepagination ne fonctionne pas, donc j'obtiens une erreur 404 sur l'url suivante:

mysite.com/literature/page/2/

fxfuture
la source
Par curiosité, qu'avez-vous essayé jusqu'à présent?
Matthew Boynes
Cette réponse m'a le plus rapproché - wordpress.stackexchange.com/questions/5308/… - mais ensuite cela n'a pas fonctionné avec la pagination et le plugin suggéré n'a pas fonctionné non plus
fxfuture
Cool, heureux d'avoir demandé, cela m'a fait gagner du temps!
Matthew Boynes

Réponses:

6

Suivez les conseils sur cette question comme vous l'avez déjà fait, mais ajoutez-le à 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, accédez à Paramètres> Permaliens et appuyez 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, faites-moi savoir comment vous vous débrouillez. Notez que la réponse standard # 1 en informatique s'applique: ça marche pour moi ... ;-)

Du pays de TMI ...

Pour référence, la raison pour laquelle les pages ne fonctionnent pas par défaut est que WordPress met en place une règle de réécriture pour la littérature /% littérature_catégorie% /% livre% /% page%, ce qui est parfaitement logique si vous y pensez. Vos permaliens par défaut ont donc 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 est de changer l'ordre de ceux-ci en désélectionnant ce dernier (nous pouvons le conserver, mais chaque réécriture a ensuite une expression régulière de plus à exécuter au 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 a plusieurs pages, cette commande sera en conflit et ses pages suivantes ne fonctionneront pas!

Matthew Boynes
la source
Mon Dieu, il m'est juste venu à l'esprit que ma syntaxe était erronée ici. Assez drôle, cela fonctionne pour moi et quand je le répare, cela ne fonctionne pas. Je vais continuer et mettre à jour ma réponse quand je le découvrirai ...
Matthew Boynes
Merci pour votre aide Matthew. J'ai essayé ça et malheureusement ça n'a pas marché. J'ai ajouté plus d'informations à ma question qui, je l'espère, l'explique mieux!
fxfuture
1
D'accord, mes excuses pour la confusion. Il y avait un peu de gaz cérébral là-bas (il devait y avoir eu récemment des haricots cérébraux). Ma réponse a été mise à jour, et encore une fois, cela fonctionne pour moi. N'oubliez pas de sauvegarder vos permaliens.
Matthew Boynes
1
Oh ok, j'ai vu votre question mise à jour. Ce n'est donc pas que / littérature / fiction / page / 2 ne fonctionne pas, c'est que / littérature / page / 2 ne fonctionne pas, n'est-ce pas? Si c'est le cas, c'est une solution facile, nous ferons la même chose à un niveau supérieur
Matthew Boynes
1
Continuons cette discussion dans le chat
Matthew Boynes