Ci sono 2 punti di attacco da coprire quando si aggiungono regole di riscrittura del tipo di post personalizzato:
Riscrivi le regole
Questo succede quando le regole di riscrittura vengono generate wp-includes/rewrite.php
in WP_Rewrite::rewrite_rules()
. WordPress ti consente di filtrare le regole di riscrittura per elementi specifici come post, pagine e vari tipi di archivio. Dove vedi posttype_rewrite_rules
la posttype
parte dovrebbe essere il nome del tuo tipo di post personalizzato. In alternativa, puoi utilizzare il post_rewrite_rules
filtro purché non annulli anche le regole postali standard.
Quindi abbiamo bisogno della funzione per generare effettivamente le regole di riscrittura:
// 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 cosa principale a cui prestare attenzione qui se decidete di giocare è il booleano 'Walk directories'. Genera regole di riscrittura per ogni segmento di un permastrotto e può causare disallineamenti delle regole di riscrittura. Quando viene richiesto un URL WordPress, l'array delle regole di riscrittura viene controllato dall'alto verso il basso. Non appena viene trovata una partita, caricherà tutto ciò che si è imbattuto, ad esempio se il tuo permastrotto ha una partita golosa, ad es. perché /%category%/%postname%/
è presente nelle directory walk e verranno emesse regole di riscrittura per entrambi /%category%/%postname%/
AND /%category%/
che corrisponderanno a qualsiasi cosa. Se ciò accade troppo presto, sei fregato.
permalink
Questa è la funzione che analizza i permalink del tipo di post e converte un permastruct (es. '/% Year% /% monthnum% /% postname% /') in un URL reale.
La parte successiva è un semplice esempio di quella che sarebbe idealmente una versione della get_permalink()
funzione trovata in wp-includes/link-template.php
. Permalink post personalizzati sono generati da get_post_permalink()
quale è una versione molto annacquata di get_permalink()
. get_post_permalink()
è filtrato da post_type_link
quindi lo stiamo usando per creare una permastruttura personalizzata.
// 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;
}
Come accennato, questo è un caso molto semplificato per la generazione di un set di regole di riscrittura personalizzato e permalink, e non è particolarmente flessibile ma dovrebbe essere sufficiente per iniziare.
Imbrogliare
Ho scritto un plug-in che ti consente di definire permastrotti per qualsiasi tipo di post personalizzato, ma come puoi usare %category%
nella struttura del permalink per i post che il mio plug-in supporta %custom_taxonomy_name%
per tutte le tassonomie personalizzate che hai anche dove si custom_taxonomy_name
trova il nome della tua tassonomia, ad es. %club%
.
Funzionerà come ti aspetteresti con tassonomie gerarchiche / non gerarchiche.
http://wordpress.org/extend/plugins/wp-permastructure/