J'ai un plugin avec un posttype personnalisé "speaker" qui peut être atteint avec le permalink normal domain.tld/speaker/speaker-name .
Dans addidtion Je souhaite utiliser une autre URL pour atteindre le même nom de locuteur:
domain.tld/slp/nom-locuteur
j'ai donc utilisé rewrite_rule pour masquer l'URL d'origine:
add_rewrite_rule('slp\/(.*)', 'index.php?slp=$matches[1]', 'top');
Je sais que je pourrais simplement le réécrire sur le permalien original, mais il est important que l'utilisateur ne voie pas le permalien original.
à l'étape suivante, j'ai ajouté le "slp" aux queryvars:
add_filter('query_vars', 'queryvars' );
function queryvars( $qvars ){
$qvars[] = 'slp';
return $qvars;
}
en utilisant add_action ("parse_request" ...), j'ai essayé d'obtenir le contrôle et de simplement renvoyer une requête contenant le message correct à Wordpress dans l'espoir que cela fonctionne:
add_action("parse_request", 'action_handler');
function action_handler($wp) {
if (isset($wp->query_vars["slp"])) {
global $wp;
$speaker_name = $wp->query_vars["slp"];
... some magic to get the $speaker_id as their is additional logic needed ...
return query_posts('p='.$speaker_id.'&post_type=speaker');
}
}
Au début, il semble que tout fonctionne parfaitement. Je peux ouvrir le message avec les deux URL, mais dans les détails, il semble que je "confuse" le flux de wordpress :(
Par exemple, cette fonction ne fonctionne pas si vous l'ouvrez à l'aide de l'URL de réécriture. Il contient le premier article de blog ("Hello World") dans le message $ post au lieu du message de conférencier. :(
function add_meta() {
global $post;
if (get_post_type($post) != "speaker") return;
echo '<meta name="robots" content="noindex, nofollow">';
}
add_action('wp_head', 'add_meta');
Comment puis-je insérer correctement le commentaire dans la boucle normale de Wordpress? Alors que d'autres plugins tels que Yoast peuvent fonctionner correctement?
add_action("parse_request", 'action_handler');
function action_handler($wp) {
if (isset($wp->query_vars["speaker"])) {
$speaker_name = $wp->query_vars["speaker"];
... some magic to get the $post_name as their is additional logic needed ...
$wp->query_vars["speaker"] = $post_name;
}
}
Merci Milo
Le problème est que, lorsque la requête principale est analysée, le simple fait de définir une requête personnalisée ne donnera pas une requête principale réussie. La configuration par défaut de la requête de publication de blogs de page d'accueil est donc définie par défaut.
Pour résoudre ce problème, définissez le type de requête post var directement dans la règle de réécriture et ces étapes intermédiaires ne sont pas nécessaires.
add_rewrite_rule('slp\/(.*)', 'index.php?speaker=$matches[1]', 'top');
Vous devrez également filtrer post_type_link
si vous souhaitez masquer l'URL d'origine lorsque des permaliens sont générés par les fonctions de l'API.
function wpd_speaker_links( $url, $post ){
if ( 'speaker' == get_post_type( $post ) ) {
return home_url( "/slp/" . $post->post_name . "/" );
}
return $url;
}
add_filter( 'post_type_link', 'wpd_speaker_links', 10, 2 );