Il y a 2 points d'attaque à couvrir lorsque vous ajoutez des règles de réécriture de type de publication personnalisées:
Réécrire les règles
Cela se produit lorsque les règles de réécriture sont générées dans wp-includes/rewrite.php
dans WP_Rewrite::rewrite_rules()
. WordPress vous permet de filtrer les règles de réécriture pour des éléments spécifiques tels que les publications, les pages et divers types d'archives. Où vous voyez posttype_rewrite_rules
la posttype
partie doit être le nom de votre type de publication personnalisé. Alternativement, vous pouvez utiliser le post_rewrite_rules
filtre tant que vous n'effacez pas également les règles de publication standard.
Ensuite, nous avons besoin de la fonction pour générer réellement les règles de réécriture:
// add our new permastruct to the rewrite rules
add_filter( 'posttype_rewrite_rules', 'add_permastruct' );
function add_permastruct( $rules ) {
global $wp_rewrite;
// set your desired permalink structure here
$struct = '/%category%/%year%/%monthnum%/%postname%/';
// use the WP rewrite rule generating function
$rules = $wp_rewrite->generate_rewrite_rules(
$struct, // the permalink structure
EP_PERMALINK, // Endpoint mask: adds rewrite rules for single post endpoints like comments pages etc...
false, // Paged: add rewrite rules for paging eg. for archives (not needed here)
true, // Feed: add rewrite rules for feed endpoints
true, // For comments: whether the feed rules should be for post comments - on a singular page adds endpoints for comments feed
false, // Walk directories: whether to generate rules for each segment of the permastruct delimited by '/'. Always set to false otherwise custom rewrite rules will be too greedy, they appear at the top of the rules
true // Add custom endpoints
);
return $rules;
}
La principale chose à surveiller ici si vous décidez de jouer est le booléen «Walk répertoires». Il génère des règles de réécriture pour chaque segment d'une infrastructure et peut entraîner des incohérences de règles de réécriture. Lorsqu'une URL WordPress est demandée, le tableau des règles de réécriture est vérifié de haut en bas. Dès qu'une correspondance est trouvée, elle chargera tout ce qu'elle a rencontré, par exemple si votre infrastructure a une correspondance gourmande, par exemple. pour les /%category%/%postname%/
répertoires for et walk est activé, il affichera des règles de réécriture pour les deux /%category%/%postname%/
ET /%category%/
qui correspondront à tout. Si cela arrive trop tôt, vous êtes foutu.
Permaliens
Il s'agit de la fonction qui analyse les permaliens de type de publication et convertit une infrastructure (par exemple, '/% year% /% monthnum% /% postname% /') en une URL réelle.
La partie suivante est un exemple simple de ce qui serait idéalement une version de la get_permalink()
fonction trouvée dans wp-includes/link-template.php
. Les permaliens personnalisés sont générés par get_post_permalink()
ce qui est une version très édulcorée de get_permalink()
. get_post_permalink()
est filtré par post_type_link
donc nous utilisons cela pour créer une permastructure personnalisée.
// parse the generated links
add_filter( 'post_type_link', 'custom_post_permalink', 10, 4 );
function custom_post_permalink( $permalink, $post, $leavename, $sample ) {
// only do our stuff if we're using pretty permalinks
// and if it's our target post type
if ( $post->post_type == 'posttype' && get_option( 'permalink_structure' ) ) {
// remember our desired permalink structure here
// we need to generate the equivalent with real data
// to match the rewrite rules set up from before
$struct = '/%category%/%year%/%monthnum%/%postname%/';
$rewritecodes = array(
'%category%',
'%year%',
'%monthnum%',
'%postname%'
);
// setup data
$terms = get_the_terms($post->ID, 'category');
$unixtime = strtotime( $post->post_date );
// this code is from get_permalink()
$category = '';
if ( strpos($permalink, '%category%') !== false ) {
$cats = get_the_category($post->ID);
if ( $cats ) {
usort($cats, '_usort_terms_by_ID'); // order by ID
$category = $cats[0]->slug;
if ( $parent = $cats[0]->parent )
$category = get_category_parents($parent, false, '/', true) . $category;
}
// show default category in permalinks, without
// having to assign it explicitly
if ( empty($category) ) {
$default_category = get_category( get_option( 'default_category' ) );
$category = is_wp_error( $default_category ) ? '' : $default_category->slug;
}
}
$replacements = array(
$category,
date( 'Y', $unixtime ),
date( 'm', $unixtime ),
$post->post_name
);
// finish off the permalink
$permalink = home_url( str_replace( $rewritecodes, $replacements, $struct ) );
$permalink = user_trailingslashit($permalink, 'single');
}
return $permalink;
}
Comme mentionné, c'est un cas très simplifié pour générer un ensemble de règles de réécriture personnalisé et des permaliens, et n'est pas particulièrement flexible, mais cela devrait suffire pour vous aider à démarrer.
La triche
J'ai écrit un plugin qui vous permet de définir des infrastructures pour tous les types de publication personnalisés, mais comme vous pouvez l'utiliser %category%
dans la structure de permalien pour les publications, mon plugin prend en charge %custom_taxonomy_name%
toutes les taxonomies personnalisées que vous avez également, où custom_taxonomy_name
est le nom de votre taxonomie, par exemple. %club%
.
Cela fonctionnera comme vous vous en doutez avec les taxonomies hiérarchiques / non hiérarchiques.
http://wordpress.org/extend/plugins/wp-permastructure/