Point de terminaison de permalien de type de publication personnalisé

8

J'ai un type de publication personnalisé appelé "destinations" et j'ai défini le masque EP pour le type de publication sur EP_PERMALINK par défaut. J'ai ajouté quelques points de terminaison comme suit:

add_filter( 'query_vars', 'add_query_vars');

function add_query_vars($vars){
    $vars[] = "tours";
    $vars[] = "activities";
    return $vars;
}

add_action('init', 'add_endpoints');

function add_endpoints(){
    global $wp_rewrite; 

    add_rewrite_endpoint('tours', EP_PERMALINK);
    add_rewrite_endpoint('activities', EP_PERMALINK);

    $wp_rewrite->flush_rules();
}

Maintenant, si je teste cela sur un post normal, il redirige vers le modèle vers lequel j'ai besoin (j'ai une redirection de modèle pour le crochet de modèle unique)

c'est à dire. somesite.com/test-category/test/activities/

Mais pour le type de publication (qui est hiérarchique), il supprime simplement le point de terminaison de l'URL et reste sur le modèle single-destination.php

c'est à dire. somesite.com/destination/south-africa/kruger-national-park/activities/

devient

somesite.com/destination/south-africa/kruger-national-park/

Toute aide ou conseil sera grandement apprécié. Je me bats avec ça depuis des heures et aucun résultat :(

Merci

Charl Pretorius
la source

Réponses:

25

Quelques choses. Tout d'abord, les noms de vos fonctions doivent être préfixés par quelque chose d'unique. WordPress est un grand écosystème, et quelqu'un d'autre a probablement utilisé tous les noms de fonctions génériques auxquels vous pouvez penser.

Deuxièmement, add_rewrite_endpointprend soin d'ajouter des variables de requête pour vous. Vous n'avez donc pas besoin de cela:

add_filter( 'query_vars', 'add_query_vars');
function add_query_vars($vars){
    $vars[] = "tours";
    $vars[] = "activities";
    return $vars;
}

Rincer les règles de réécriture sur chaque chargement n'est pas une bonne idée. Cela ne doit être fait qu'une fois après l'ajout de vos règles. Comme lors de l'activation du plugin. Ainsi, votre add_endpointsfonction pourrait être court-circuitée avec un meilleur nom de fonction par le point un ci-dessus.

<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
    add_rewrite_endpoint('tours', EP_PERMALINK);
    add_rewrite_endpoint('activities', EP_PERMALINK);
}

Ce qui fonctionne bien pour les messages. Si vous souhaitez qu'il fonctionne sur des pages ou tout autre type de publication hiérarchique, vous devrez utiliser le EP_PAGESmasque de point de terminaison.

<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
    add_rewrite_endpoint('tours', EP_PAGES);
    add_rewrite_endpoint('activities', EP_PAGES);
}

Mais cela ne fonctionnera toujours pas comme prévu pour vous. Les points de terminaison définissent leur variable de requête égale à tout ce qui vient après. Donc, si votre URL est ...

yoursite.com/some-country/some-city/activities/asdf

les activités des variables de requête seront en format PDF. Si rien ne suit activities, votre requête var sera vide (mais définie), elle sera donc toujours considérée comme fausse lorsque vous tenterez de l'attraper ...

<?php
add_action( 'template_redirect', 'wpse42279_catch_vars' );
function wpse42279_catch_vars()
{
    if( get_query_var( 'tours' ) )
    {
        // do stuff!
        exit();
    }
}

Vous pouvez contourner ce problème en filtrant requestet en modifiant la valeur de vos variables de visites et d'activités sur true si elles sont définies.

<?php
add_filter( 'request', 'wpse42279_filter_request' );
function wpse42279_filter_request( $vars )
{
    if( isset( $vars['tours'] ) ) $vars['tours'] = true;
    if( isset( $vars['activities'] ) ) $vars['activities'] = true;
    return $vars;
}

Vous devriez jeter un œil à ce guide de l'API de réécriture que j'ai écrit. Cependant, les parties pertinentes de votre question sont résumées ci-dessus.

chrisguitarguy
la source
1
Merci pour la réponse impressionnante! J'ai fait les modifications en fonction de votre message et de votre guide. Mais il semble que wordpress redirige / supprime le point de terminaison et tous les vars après le chargement de l'url. Je ne sais pas si c'est une redirection canonique ou quoi. Mais il supprime uniquement les points de terminaison enregistrés. Si j'ajoute quelque chose d'arb à la fin de l'URL, j'obtiens un 404. Mais les visites ou les activités sont supprimées ou redirigées vers l'URL de destination unique. :(
Charl Pretorius
1
Il semble que j'ai trouvé le problème. A à voir avec les paramètres de permalien. J'avais un paramètre personnalisé - /% category% /% postname% /. Mais si je le mets juste en /% postname% / ça marche, je ne sais pas encore pourquoi, mais j'aurai un coup d'oeil. Merci \ 0 /
Charl Pretorius
1
Vous devriez essayer de le rétablir dans /% category% /% postname% / maintenant et cela pourrait fonctionner à nouveau. Je soupçonne que WP a supprimé vos trucs parce que vous deviez vider les règles de réécriture. (Peut-être.)
chrisguitarguy
1
J'avais également un paramètre de permalien personnalisé. Je suis simplement allé dans les paramètres Permaliens et j'ai cliqué sur Enregistrer les modifications sans rien changer, puis le point de terminaison a fonctionné.
yitwail
Cela m'aide beaucoup! Merci beaucoup mon frère!
fdrv