J'ai une table de base de données en dehors de WordPress pour laquelle j'ai besoin de créer des points de terminaison. J'ai créé une page /cars/
où je prévois d'utiliser un modèle de page pour générer des liens. J'aimerais que l'URL ressemble à /cars/camaro/
(/cars/%model%/
). Au départ, je pensais pouvoir le faire avec des points de terminaison, mais je ne savais pas comment les rendre dynamiques à partir du slug extrait de la table de modèle. Je ne savais pas non plus s'il serait plus facile d'utiliser les balises Permalink Structure ou ce qui était préférable.
Je ne sais même pas par où commencer, j'ai déjà créé des points de terminaison "statiques", donc j'avais une base de départ, mais lorsque j'arrive au filtre request
, je ne sais pas trop quoi faire.
/**
* Add endpoint to handle models
*/
function theme_endpoints() {
add_rewrite_endpoint( 'cars', 'EP_PAGES' ); // Since cars is our base
}
add_action( 'init', 'theme_endpoints' );
/**
* Filter request variables
* @param array $vars
* @return array $vars
*/
function theme_perma_requests( $vars ) {
if( isset( $vars['model'] ) ) {
$vars['model_template'] = true;
}
return $vars;
}
add_filter( 'request', 'theme_perma_requests' );
Je veux dire, cela me permet de ma template_include (c'est pourquoi j'ai ajouté la variable model_template
) mais elle ne réécrit pas réellement l'URL. Alors j'ai commencé à jouer avec add_rewrite_rule()
/**
* Theme rewrite rules
*/
function theme_rewrite_rules() {
add_rewrite_rule( '^cars/([^/]*)/?$', 'index.php?page_id=8&model=$matches[0]', 'top' );
}
add_action( 'init', 'theme_rewrite_rules' );
J'ai écrasé mes permaliens mais les réécritures ne semblent pas prendre effet, je ne peux que supposer que quelque chose ne va pas avec la façon dont la règle est écrite.
Est-ce que j'ai besoin de les deux du point de terminaison et de la règle de réécriture ou de l'un des deux? Est-ce que je m'y prends complètement mal? Comment puis-je obtenir la structure permalien de /cars/camaro/
?
Les meilleures pratiques d'ingénierie 10up constituent un excellent exemple de la manière de réaliser cet objectif. En gros, vous ajoutez une nouvelle balise de réécriture et une nouvelle règle de réécriture, puis utilisez l'action template_redirect pour renvoyer votre action personnalisée.
Voici le code:
add_action( 'init', function() {
add_rewrite_tag( '%model%', '([^/]+)' );
add_rewrite_rule( 'cars/([^/]+)/?', 'index.php?model=$matches[1]', 'top' );
} );
add_action( 'template_redirect', function() {
global $wp_query;
$model = $wp_query->get( 'model' );
if ( ! empty( $model ) ) {
// Return stuff here
}
} );
N'oubliez pas de vider les permaliens avant d'essayer votre nouveau terminal! En utilisant wp-cli:
wp rewrite flush
Ou en utilisant l'interface utilisateur d'administration: http: //example.local/wp-admin/options-permalink.php et cliquez sur Enregistrer.