web-dev-qa-db-fra.com

Pourquoi la règle de réécriture fonctionne-t-elle pour la page et non pour le type de message personnalisé?

Update: J'ai lu qu'une règle de réécriture personnalisée pourrait être remplacée et supprimer toutes les variables de paramètre lorsque la règle de réécriture personnalisée est utilisée sur une page/publication enfant/parent. La règle de publication pour laquelle ma règle de réécriture personnalisée est destinée n'est pas un enfant/parent mais fait partie d'un type de publication personnalisé. Cela pourrait-il causer des problèmes de réécriture similaires (variables de paramètre supprimées)?

Mise à jour 2 (problème résolu): Comme mentionné dans la mise à jour ci-dessus, le fait qu'il s'agisse d'une règle de réécriture pour une publication de type publication personnalisée était effectivement à l'origine du problème. S'il vous plaît voir ma réponse pour la solution.

Ma question

Lorsque vous utilisez le code ci-dessous, le post rewrite actuel semble fonctionner, car il conduit correctement au post avec l'ID 160. Et cela, même en utilisant une jolie URL de paramètre. Mais une fois que la jolie URL du paramètre est redirigée vers la publication portant l'ID 160, toutes les valeurs de paramètre ont disparu.

Comment puis-je obtenir que WP ne supprime pas le paramètre personnalisé lors de l'utilisation d'une jolie URL de paramètre?

Donc une URL comme:

site.com/post/parameter-value/

Devrait rediriger (vers le message avec l'ID 160) comme suit:

site.com/custom-post-type-slug/post-title-of-160/parameter-value/ (la valeur du paramètre n'est pas supprimée)

Le code que j'utilise

function add_custom_query_vars($vars) {
    $vars[] = 'member_view';
    return $vars;
}
add_filter('query_vars', 'add_custom_query_vars');

function add_rewrite_rules($rules) {
$newrules = array('page/([^/]+)/?$' => 'index.php?page_id=158&member_view=$matches[1]',
                  'post/([^/]+)/?$' => 'index.php?p=160&member_view=$matches[1]');
$rules = $newrules + $rules;
return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

Les détails

J'utilise le code ci-dessus pour réécrire les URL en jolies URL, en terminant par de jolies valeurs de paramètres personnalisées. Voici ce qui fonctionne et ce qui ne fonctionne pas:

pour les pages (cela fonctionne)

La règle de réécriture pour les pages fonctionne. Une URL comme:

site.com/page/parameter-value/

Redirige (vers la page avec l'ID 158) comme suit:

site.com/page-title-of-158/parameter-value/

Et get_query_var('member_view') renvoie parameter-value.

Pour les messages (en utilisant une URL non jolie) (cela fonctionne)

Pour les publications, les paramètres ne sont valides que lorsque vous utilisez des URL "non jolies":

site.com/?p=160&member_view=parameter-value

Ou:

site.com/custom-post-type-slug/post-title-of-160/?member_view=parameter-value

Les deux redirigent (vers le message avec l'ID 160) comme suit:

site.com/custom-post-type-slug/post-title-of-160/?member_view=parameter-value

Et la valeur member_view peut être récupérée.

Pour les messages (en utilisant une jolie URL) (cela ne fonctionne pas)

Lorsque vous utilisez une jolie URL de paramètre, le paramètre personnalisé est supprimé une fois le processus de redirection canonical.php terminé. Donc, une URL qui ressemble à:

site.com/post/parameter-value/

Redirige (vers la publication avec l'ID 160) comme suit:

site.com/custom-post-type-slug/post-title-of-160/ (la valeur du paramètre a disparu)

Et get_query_var('member_view') et $_GET['member_view'] ne renvoient rien.

1
Ralph

Eh bien, j'ai trouvé la solution. Il semble que, lorsque vous appliquez une règle de réécriture à une publication de type publication personnalisée, il est nécessaire d'indiquer à WP le nom du type de publication personnalisée dans la règle de réécriture elle-même.

Voici le code qui fonctionne PAS (redirige et supprime les variables de paramètre au lieu de réécrire):

function add_rewrite_rules($rules) {
    $newrules = array('cpt-slug/([^/]+)/([^/]+)/?$' => 'index.php?p=$matches[1]&member_view=$matches[2]');
    $rules = $newrules + $rules;
    return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

Voici le code que FONCTIONNE (réécrit et conserve les variables de paramètre):

function add_rewrite_rules($rules) {
    $newrules = array('cpt-slug/([^/]+)/([^/]+)/?$' => 'index.php?p=$matches[1]&post_type=cpt_name&member_view=$matches[2]');
    $rules = $newrules + $rules;
    return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

La réécriture a fonctionné une fois que &post_type=cpt_name a été ajouté à sa règle. Je suis étonné que cela ne soit/n'a pas été explicitement mentionné dans les informations de réécriture des règles que j'ai trouvées et lues (et que j'ai recherchées pendant 2 jours) :)

Une URL qui se présente comme suit:

site.com/cpt-slug/INSERT-ID-OF-CPT-POST/INSERT-PARAMETER-VARIABLE/

Va maintenant réécrire correctement et les variables de paramètre ne seront pas supprimées. La variable de paramètre peut maintenant être extraite à l'aide de get_query_var('member_view').

1
Ralph

Recherchez la fonction add_rewrite_tag. Vous devez ajouter une balise pour rattraper toute variable dans une réécriture; ou ça va être laissé tomber

Dans votre cas, cela devrait faire l'affaire:

add_rewrite_tag( '%ps-cpt-parameter%', '([^/]+)');
add_rewrite_rule('post/([^/]+)/([^/]+)/?', 'index.php?p=$matches[1]&ps-cpt-parameter=$matches[2]', 'top' );

// And then you could get the variable with

get_query_var('ps-cpt-parameter');

En passant, avec add_rewrite_rule, vous pouvez définir si vous souhaitez que vos règles de réécriture personnalisées soient placées avant ou après toute autre règle.

0
PotterSys