web-dev-qa-db-fra.com

Query var enlevé après réécriture

J'ai un blog WordPress qui utilise des types de publication personnalisés, que je crée à l'aide du plugin WCK . L'un d'eux est le type de publication affiche . Un lien permanent vers une émission spécifique apparaît alors comme suit:

http://my-website.com/wordpress/shows/show-slug/

Tout cela se fait via la fonctionnalité actuelle de WP et le plugin WCK. Cependant, j'essaie d'ajouter un autre "niveau" d'informations détaillées à afficher sur cette page. Pour cela, j'utilise la variable de requête d'URL item pour désigner cela.

Ainsi, par exemple, si je veux voir la liste des épisodes d'un certain spectacle, je pourrais visiter l'URL:

http://my-website.com/wordpress/shows/show-slug/?item=episodes

Ces "éléments" varient d'une émission à l'autre et sont plus ou moins arbitraires, mais j'ai déjà la logique sur le modèle single-shows.php pour déterminer si l'élément fourni dans la requête d'URL est valide ou non pour cette émission.

Quoi qu'il en soit, je souhaite utiliser la fonctionnalité de réécriture pour rendre les URL un peu plus agréables, au format suivant:

http://my-website.com/wordpress/shows/show-slug/episodes

C'est là que je rencontre des problèmes. Voici mon script PHP dans le fichier functions.php de mon thème pour enregistrer cette requête d'URL var et la règle de réécriture:

function shows_item_tag_registration() {
    global $wp; 
    $wp->add_query_var('item'); 
}

function shows_item_rule_registration($rules) {
    $newrules = array();
    $newrules['^shows/([^/]+)/([^/]+)/?$'] = 'index.php?pagename=shows/$matches[1]&item=$matches[2]';
    return $newrules + $rules;
}

add_filter( 'rewrite_rules_array','shows_item_rule_registration' );
add_action( 'init','shows_item_tag_registration' );

Je ne vide pas moi-même les règles de réécriture, car je ne veux pas perdre les règles écrites par les paramètres Permalinks dans WP Admin. Comme vous pouvez le constater, j'ajoute ma règle à la "liste actuelle" dans le filtre rewrite_rules_array . Pour appliquer les modifications, je réenregistre les paramètres Permalinks dans WP admin, et cela semble faire l'affaire dans la mesure du possible.

Frustrement, cela fonctionne presque, mais lorsque j'essaie de visiter l'URL avec l'élément à la fin, comme suit:

http://my-website.com/wordpress/shows/show-slug/episodes

Cela me redirige simplement vers:

http://my-website.com/wordpress/shows/show-slug/

Et supprime complètement l'élément de la requête. J'ai trouvé cette question Stack Exchange qui semblait assez similaire, mais je n'ai pas été en mesure de résoudre mon problème avec la réponse à partir de là.

1
William Thomas

Peut-être que vous n'utilisez pas les crochets corrects ni la règle de réécriture correcte. Vous êtes en train de réécrire à pagename, qui est pour les pages. Vous devriez utiliser name pour obtenir des messages par slug.

add_filter('query_vars', 'cyb_add_query_vars');
function cyb_add_query_vars( $vars) {
   $vars[] = "item";
   return $vars;
}
add_action('init','cyb_add_rewrite_rules');
function cyb_add_rewrite_rules() {
    add_rewrite_rule( ''^shows/([^/]+)/([^/]+)/?$'' , 'index.php?post_type=shows&name=$matches[1]&item=$matches[2]' , 'top' );
}

Vous pouvez également ajouter un point de terminaison et utiliser des URL telles que http://my-website.com/wordpress/shows/show-slug/item/episodes:

add_action('init','cyb_add_endpoint');
function cyb_add_endpoint() {
    add_rewrite_endpoint( 'item', EP_PERMALINK );
}

Et n'oubliez pas de vider les règles de rewirte. Si vous ne souhaitez pas coder le vidage, visitez la page des paramètres de permalien dans la zone wp-admin, cliquez sur Enregistrer et les règles de réécriture seront vidées.

2
cybmeta