J'ai ces limaces sur mon site
http://www.domain.com/about (standard WP page)
http://www.domain.com/custom-slug (not a WP page, post or custom post type)
J'essaie de développer une règle de réécriture correspondant à ce dernier scénario, de les rediriger vers mon plugin personnalisé afin que je puisse rendre le contenu pour eux. Ma règle de réécriture ressemble à ceci
add_rewrite_rule('^(.*)/?', 'index.php?pagename=special-page&id=$matches[1]', 'bottom');
En le définissant sur 'bottom'
, il démarre après toutes les autres règles de réécriture de WordPress et ne sera donc pas traité. WordPress enverra une demande pour /custom-slug
à la page 404.
Si je règle la règle de réécriture sur 'top'
, chaque page de WordPress sera mise en correspondance. Ce serait bien si ma règle de réécriture était exécutée et si elle vérifiait dans une table de base de données personnalisée si /custom-slug
était un slug valide dans mon système personnalisé. Si tel est le cas, restituez le contenu. Si WordPress ne continue pas à essayer de trouver une correspondance (redirection /about
vers la page de présentation du site)
Normalement, les règles de réécriture sont plus simples lorsque vous faites correspondre un mot-clé spécifique dans l'URL suivi d'une chaîne, mais cela ne fonctionnera pas pour moi - toutes les marques auront la même apparence.
Des idées sur la meilleure façon d'accomplir cela?
Vous ne pouvez pas faire cela avec une règle de réécriture, la règle de page normale correspond déjà, mais vous pouvez intercepter les données extraites de cette règle avant qu’elles ne soient transformées en requête.
Nous faisons cela en accrochant l'action parse_request
, où nous pouvons rechercher un slug personnalisé et modifier directement l'objet de la requête. Je vous recommande var_dump($query)
et jetez un coup d'œil à l'objet complet pour différents types de demandes. Voir les commentaires dans le code.
add_action( 'parse_request', 'wpd_check_for_my_custom_slug' );
function wpd_check_for_my_custom_slug( $query ) {
if( isset( $query->query_vars['pagename'] ) ){
// check if the slug matches some custom content
// replace this with your query code
if( 'my-custom-slug' == $query->query_vars['pagename'] ){
// the request is for a custom slug
// store the originally requested slug
$query->query_vars['my_special_var'] = $query->query_vars['pagename'];
// and load a placeholder page
$query->query_vars['pagename'] = 'placeholder-page';
}
}
}
Notez que si votre structure de lien permanent est simplement %postname%
, le slug sera dans name
, pas pagename
. Vous devrez alors aussi unset
name
après.
Si vous envisagez de charger un fichier de thème à la fin de ce processus, je vous suggère d'utiliser une page de marque de réservation du type post page
pour ces demandes. WordPress s'attend à ce qu'un objet de publication existe pour qu'un modèle soit correctement rendu. Vous pouvez filtrer et remplacer tous les titres, le contenu, etc.
Si vous envisagez de sortir quelque chose de complètement personnalisé, vous pouvez le charger et juste exit
ici.