Je passe maintenant des paramètres à un modèle personnalisé au format suivant
www.example.com/?pageid=12&rid=24&title=this-is-the-title
J'ai créé deux tables. J'ai donc besoin de récupérer des données et de les afficher sur ces pages.
Je voudrais qu'il utilise un format d'URL propre comme:
www.example.com/pageid/12/rid/24/title/this-is-the-title
Quelqu'un peut-il dire comment cela peut être réalisé?
Merci
add_rewrite_rule()
vous permet de transformer la jolie URL en variables.
(\d*)
/rid/
ou /pageid/
([a-zA-Z0-9-]+
Voici une classe pour enregistrer la réécriture et gérer la demande si une correspondance a été trouvée.
<?php
if ( ! class_exists( 'CPTURLRewrite' ) ):
class CPTURLRewrite {
const ENDPOINT_QUERY_NAME = 'pageid';
const ENDPOINT_QUERY_PARAM = '__pageid';
// WordPress hooks
public function init() {
add_filter( 'query_vars', array ( $this, 'add_query_vars' ), 0 );
add_action( 'parse_request', array ( $this, 'sniff_requests' ), 0 );
add_action( 'init', array ( $this, 'add_endpoint' ), 0 );
}
// Add public query vars
public function add_query_vars( $vars ) {
// add all the things we know we'll use
$vars[] = static::ENDPOINT_QUERY_PARAM;
$vars[] = 'pageid';
$vars[] = 'rid';
$vars[] = 'title';
return $vars;
}
// Add API Endpoint
public function add_endpoint() {
// numbers: (\d*)
// section: /rid/
// slug: ([a-zA-Z0-9-]+
add_rewrite_rule( '^' . static::ENDPOINT_QUERY_NAME . '/(\d*)/rid/(\d*)/title/([a-zA-Z0-9-]+)?', 'index.php?' . static::ENDPOINT_QUERY_PARAM . '=1&pageid=$matches[1]&rid=$matches[2]&title=$matches[3]', 'top' );
//////////////////////////////////
flush_rewrite_rules( false ); //// <---------- REMOVE THIS WHEN DONE
//////////////////////////////////
}
// Sniff Requests
public function sniff_requests( $wp_query ) {
global $wp;
if ( isset(
$wp->query_vars[ static::ENDPOINT_QUERY_PARAM ],
$wp->query_vars[ 'pageid' ],
$wp->query_vars[ 'rid' ],
$wp->query_vars[ 'title' ] ) ) {
$this->handle_request(); // handle it
}
}
// Handle Requests
protected function handle_request() {
global $wp;
// (optional) act on the query vars
$pageid = $wp->query_vars[ 'pageid' ];
$rid = $wp->query_vars[ 'rid' ];
$title = $wp->query_vars[ 'title' ];
// (optional) select your custom template
add_filter( 'template_include', function( $original_template ) {
return __DIR__ . '/custom.php';
} );
}
}
$wpCPTURLRewrite = new CPTURLRewrite();
$wpCPTURLRewrite->init();
endif; // CPTURLRewrite
J'ai trouvé un moyen plus simple de gérer cela.
http://example.com/pageid/333/rid/444/title/your-title-here/
Cette nouvelle méthode utilise add_rewrite_tag
with _
pour exécuter la requête pour l'ID d'une page sans perturber la requête principale. Dans l'exemple ci-dessus, 333
modifierait simplement la requête pour rechercher cet ID de publication dans pre_get_posts
. Vous pouvez tout aussi facilement modifier template_redirect
ou template_include
.
/**
* Register a rewrite endpoint for the API.
*/
function prefix__init() {
// add tags with `_` prefix to avoid screwing up query
add_rewrite_tag( '%_pageid%', '(\d*)' );
add_rewrite_tag( '%_rid%', '(\d*)' );
add_rewrite_tag( '%_title%', '([a-zA-Z\d\-_+]+)' );
// create URL rewrite
add_rewrite_rule( '^pageid/(\d*)/rid/(\d*)/title/([a-zA-Z\d\-_+]+)?', 'index.php?_pageid=$matches[1]&_rid=$matches[2]&_title=$matches[3]', 'top' );
// required once after rules added/changed
// flush_rewrite_rules( true );
}
add_action( 'init', 'prefix__init' );
/**
* Handle data (maybe) passed to the API endpoint.
*
* @param $query
*/
function prefix__pre_get_posts( $query ) {
if ( isset( $query->query_vars[ '_pageid' ], $query->query_vars[ '_rid' ], $query->query_vars[ '_title' ] ) ) {
// set the query to search for a page using `_pageid`
$query->set( 'p', $query->query_vars[ '_pageid' ] );
}
}
add_action( 'pre_get_posts', 'prefix__pre_get_posts' );
Pour référencer tous les paramètres passés plus tard:
/**
* Debug the query params at any point
*/
function prefix__show_query_args() {
global $wp_query;
echo "<pre>";
print_r( array (
'pageid' => $wp_query->query_vars[ '_pageid' ],
'rid' => $wp_query->query_vars[ '_rid' ],
'title' => $wp_query->query_vars[ '_title' ],
'file' => __FILE__,
'line' => __LINE__,
) );
echo "</pre>";
}
Si vous voulez une solution simple, cela peut être le cas (n'ayant pas testé le code, il est donc possible que ce ne soit pas si simple si cela ne fonctionne pas ...) ou au moins donne un indice de ce que vous devez faire. Si vous visitez http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/ vous trouverez un prix bonus: un générateur de règles de réécriture dans l'article. Je l'ai déjà utilisé auparavant, mais pas dans une situation comme celle-ci. Essayez de combiner cette fonction avec quelque chose comme ceci:
add_rewrite_tag('%pageid%','([^&]+)');
add_rewrite_tag('%rid%','([^&]+)');
add_rewrite_tag('%title%','([^&]+)');
/* Generate rewrite rules. */
add_action( 'generate_rewrite_rules', 'example_add_rewrite_rules' );
function example_add_rewrite_rules() {
global $wp_rewrite;
$new_rules = eg_generate_rewrite_rules( 'post' , array('pageid','rid','title')); // post = the post type you use
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
/* Flush rewrite rules on theme activation only. */
add_action( 'load-themes.php', 'frosty_flush_rewrite_rules' );
function frosty_flush_rewrite_rules() {
global $pagenow;
if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) )
flush_rewrite_rules();
}
Si vous ne souhaitez pas utiliser la fonction eg_generate_rewrite_rules, vous devez configurer les règles vous-même. Vous pouvez trouver des informations sur la façon de procéder dans cet article.
Plus d'infos: http://codex.wordpress.org/Rewrite_API/add_rewrite_tag