web-dev-qa-db-fra.com

Point de terminaison permalien de type message personnalisé

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 finaux 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 article normal, il redirige vers le modèle dont j'ai besoin (j'ai une redirection de modèle pour le hook de modèle unique)

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

Mais pour le type de publication (qui est hiérarchique), cela supprime simplement le noeud final 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 conseils seront grandement appréciés. J'ai eu du mal avec cela pendant des heures et aucun résultat :(

Merci

8
Charl Pretorius

Un couple de choses. Tout d'abord, les noms de vos fonctions doivent être précédés de 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_endpoint se charge d’ajouter des variables de requête pour vous. Donc vous n’avez pas besoin de ça:

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

Effacer les règles de réécriture à chaque chargement n'est pas une bonne idée. Cela ne doit être fait qu'une fois vos règles ajoutées. Comme lors de l'activation d'un plugin. Donc, votre fonction add_endpoints pourrait être raccourcie à cela (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 que cela fonctionne sur des pages ou tout autre type de publication hiérarchique, vous devez utiliser le masque de noeud final EP_PAGES.

<?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 à ce qui vient après. Donc, si votre URL est ...

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

les activités de la variable de requête seront asdf. Si rien ne suit activities, votre requête var sera vide (mais définie), elle sera donc toujours évalué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 request et 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 coup d'oeil à ce guide de l'API Rewrite j'ai écrit. Les parties pertinentes de votre question sont toutefois résumées ci-dessus.

24
chrisguitarguy