J'ai deux types de messages personnalisés:
J'ai une nouvelle taxonomie que partagent ces deux CTP:
Si je vais sur "domain.com/events/", je vois une archive de tous les événements, et si je vais sur "domain.com/businesses/", je vois une archive de toutes les entreprises. Jusqu'ici tout va bien.
Si je vais sur "domain.com/locations/", je vois une archive de tous les événements et entreprises, ce qui est OK.
Cependant, comment puis-je afficher les lieux de l'événement uniquement? "domain.com/locations/events" ou "domain.com/events/locations" ne fonctionne pas.
Dois-je modifier les paramètres de réécriture pour la taxonomie des emplacements ou le CPT? Il semble que je suis coincé!
Vous devrez ajouter de nouvelles règles de réécriture. Heureusement, WordPress simplifie les choses en utilisant quelques appels de fonction.
// use the init action to modify rewrite rules
add_action( 'init', function() {
global $wp_rewrite;
// add rewrite tag for the post type
// - %posttype% is a new tag that will be replaced with the regex in the actual query
// - the regex will extract the post_type name from the URL and use it in the query
add_rewrite_tag( '%posttype%', '([^/]+)', 'post_type=' );
// create the new permastruct by combining the post type & taxonomy permastructs
// - custom taxonomies and post types are added to the extra_permastructs array in WP_Rewrite
// - change 'category' to desired taxonomy
// - output will be '%posttype%/category/%category%'
$types_and_cats_permastruct = '%posttype%' . $wp_rewrite->get_extra_permastruct( 'category' );
// add the permastruct for post type & taxonomy
add_permastruct( 'post_type_and_category', $types_and_cats_permastruct, array(
'with_front' => true, // - with_front (bool) - Should the structure be prepended with WP_Rewrite::$front? Default is true.
'ep_mask' => EP_ALL_ARCHIVES, // - ep_mask (int) - Endpoint mask defining what endpoints are added to the structure. Default is EP_NONE.
'paged' => true, // - paged (bool) - Should archive pagination rules be added for the structure? Default is true.
'feed' => true, // - feed (bool) - Should feed rewrite rules be added for the structure? Default is true.
'forcomments' => false, // - forcomments (bool) - Should the feed rules be a query for a comments feed? Default is false.
'walk_dirs' => false, // - walk_dirs (bool) - Should the 'directories' making up the structure be walked over and rewrite
// rules built for each in turn? Default is true.
'endpoints' => true // - endpoints (bool) - Should endpoints be applied to the generated rewrite rules? Default is true.
) );
} );
Donc, pour expliquer ce que je fais ci-dessus:
add_rewrite_tag()
pour que, lorsque vous placez le nom du type de publication personnalisé dans l'URL (par exemple,/events/location/uk /), il soit reconnu par l'expression régulière et la requête résultante WP les courses contiendraient post_type=events
/event/location/uk
affichera les événements au Royaume-Uni et /business/location/uk
affichera les entreprises au Royaume-Uniadd_permastruct()
afin que WP génère les nouvelles règles de réécriture chaque fois que les permaliens sont actualisés. Dans le troisième paramètre, il est très important que walk_dirs
soit défini sur false, car vous obtiendrez des règles de réécriture agressives indésirables avec des archives pour /%posttype%/category/
et /%posttype%/
.the_terms()
pour générer des liens de localisation pour une entreprise ou un événement affichant uniquement le type de publication d'origine, vous devrez filtrer les URL ou écrire une fonction personnalisée dans les URL de sortie en fonction de votre permastructure.Vous pouvez spécifier le slug à utiliser dans les arguments lors de l'appel de la fonction register_taxonomy à l'aide de 'rewrite'.
Donc, vous auriez quelque chose comme ce qui suit:
$args = array(
'labels' => $labels,
'rewrite' => array( 'slug'=>'events/locations' )
);
register_taxonomy( 'event_location_tax_name', 'event_location_cpt_name', $args );
Et ensuite, répliquez pour les entreprises:
$args = array(
'labels' => $labels,
'rewrite' => array( 'slug'=>'businesses/locations' )
);
register_taxonomy( 'business_location_tax_name', 'business_location_cpt_name', $args );
J'espère que cela pourra aider?!
Merci Rik