web-dev-qa-db-fra.com

Règle de réécriture Wordpress pour les types de publication imbriqués

J'ai une structure de site assez compliquée et n'arrive pas à faire en sorte que la structure d'URL fonctionne correctement, y compris la pagination. Il s’agit principalement de charger des articles assignés à un type de publication personnalisé spécifique, qui peuvent tous être imbriqués.

Mes types de postes de registre (découpés):

register_post_type('continent',
    array(
        'rewrite' => array('slug' => 'moving-to'),
    )
);

register_post_type('country',
    array(
        'rewrite' => array('slug' => 'moving-to/%continent%'),
    )
);

J'ai donc une catégorie moving-to, un type de message personnalisé continent et un type de message personnalisé country.

/moving-to/

/moving-to/continent

/moving-to/continent/country

Ces trois premières affichent les postes de la catégorie, les postes attribués au continent et les postes attribués au pays. Je ne parviens pas à utiliser la pagination car je pense que le /continent/country interfère avec la pagination /page/n.

/moving-to/page/2 - Fonctionne bien

/moving-to/continent/page/2 - Essaie de charger la "page" d'un pays inconnu

/moving-to/continent/country/page/2 - Enlève la page/2 de l'URL

Je suppose que je dois exclure tout pays de "page" de la réécriture, ou tout simplement ne pas avoir de continent imbriqué dans l'URL.

La deuxième partie consiste à avoir une catégorie après chaque continent ou pays

/moving-to/continent/category-name

/moving-to/continent/country/category-name

À nouveau avec la pagination

/moving-to/continent/category-name/page/2

/moving-to/continent/country/category-name/page/2

/moving-to/continent/country

Je réalise que tout cela semble un peu spécifique (limite hors sujet). Je demande fondamentalement comment activer les structures d'URL suivantes:

/moving-to/
/moving-to/continent/
/moving-to/continent/country
/moving-to/page/2
/moving-to/continent/page/2
/moving-to/continent/country/page/2
/moving-to/continent/category
/moving-to/continent/country/category
/moving-to/continent/category/page/2
/moving-to/continent/country/category/page/2
1
Alexander Holsgrove

Le principal problème de la façon dont Wordpress utilise les expressions rationnelles pour l'analyse/le routage/la "réécriture" des URL est l'absence de contexte dans regexp. Toutes les URL des pays dont vous aurez besoin doivent être dans le contexte spécifique d'un continent. S'il existe deux pays portant le même nom best country, l'un sur continent big et l'autre sur continent small, vous souhaiterez une URL telle que /big/best-country et /small/best-country.

Wordpress a besoin de/essaie de comprendre quelle page charger directement en fonction de l'URL sans accès supplémentaire à la base de données, en localisant son slug dans l'URL, mais il ne peut pas le faire dans cette structure. Il peut trouver la limace du continent, mais la limace du pays est problématique car il y a deux résultats possibles. En fait, Wordpress ne vous laissera jamais entrer dans une telle situation à moins que vous ne le forciez, et ajoutera un suffixe -nnn lorsqu’un second message est créé avec un slug déjà existant.

Le seul moyen de contourner ce problème consiste à implémenter votre propre analyse avant que Wordpress ne s'en mêle.

Mais… peut-être que vous complexifiez votre vie sans raison du tout, car heureusement sur Terre, il n’existe pas deux pays portant le même nom; vous pouvez donc utiliser des slugs comme continent-country et utiliser .htaccess. règle pour convertir continent/country en continent-country. Pour que cela fonctionne correctement, vous devrez également vous préoccuper de la façon dont les permaliens sont calculés, mais le problème est beaucoup plus facile à résoudre.

1
Mark Kaplun