web-dev-qa-db-fra.com

Plusieurs types d'articles personnalisés utilisant la même taxonomie = frustrations d'URL

J'ai deux types de messages personnalisés:

  • Événements
  • Entreprises

J'ai une nouvelle taxonomie que partagent ces deux CTP:

  • Emplacements

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é!

3
pixelkicks

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:

  1. Ajout d'une balise de réécriture avec 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
  2. Créer une nouvelle permastructure pour générer des règles pour l’utilisation de la balise que nous venons d’ajouter et de la taxonomie existante, dans votre cas, c’est l’emplacement; /event/location/uk affichera les événements au Royaume-Uni et /business/location/uk affichera les entreprises au Royaume-Uni
  3. L'ajout de la nouvelle permastruct avec add_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%/.

Gotchas

  • Génération de liens - si vous souhaitez utiliser 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.
  • Si vous ne voulez jamais d'archives répertoriant à la fois les événements et les entreprises, deux taxonomies distinctes sont une meilleure idée, car vous serez plus facilement en mesure de savoir si un terme comporte des publications, par exemple. lors de la génération de liens et la décision de générer ou non un lien vers une archive vide. Dans ce cas La réponse de @ richard-howarth est correcte
3
sanchothefat

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

0
Richard Howarth