Es gibt zwei Angriffspunkte, die beim Hinzufügen benutzerdefinierter Umschreiberegeln für Beitragstypen abgedeckt werden müssen:
Regeln umschreiben
Dies geschieht, wenn die Umschreiberegeln in wp-includes/rewrite.php
in generiert werden WP_Rewrite::rewrite_rules()
. Mit WordPress können Sie die Umschreiberegeln für bestimmte Elemente wie Beiträge, Seiten und verschiedene Arten von Archiven filtern. Wo Sie posttype_rewrite_rules
das posttype
Teil sehen, sollte der Name Ihres benutzerdefinierten Beitragstyps sein. Alternativ können Sie den post_rewrite_rules
Filter verwenden, solange Sie nicht auch die Standard-Post-Regeln außer Kraft setzen.
Als nächstes benötigen wir die Funktion, um die Umschreiberegeln zu generieren:
// 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;
}
Die wichtigste Sache, auf die Sie achten sollten, wenn Sie herumspielen möchten, ist der Boolesche Wert "Walk directorys". Es generiert Überschreibungsregeln für jedes Segment einer Permastruktur und kann Überschreibungsregelinkongruenzen verursachen. Wenn eine WordPress-URL angefordert wird, wird das Array mit den Umschreiberegeln von oben nach unten überprüft. Sobald ein Match gefunden wird, wird es geladen, was auch immer es gefunden hat, zum Beispiel wenn Ihr Permastruct ein gieriges Match hat, z. for- /%category%/%postname%/
und walk-Verzeichnisse geben Umschreibregeln für /%category%/%postname%/
UND aus, /%category%/
die mit allen übereinstimmen. Wenn das zu früh passiert, bist du fertig.
Permalinks
Dies ist die Funktion, die die Permalinks des Post-Typs analysiert und ein Permastruct (z. B. '/% year% /% monthnum% /% postname% /') in eine tatsächliche URL konvertiert.
Der nächste Teil ist ein einfaches Beispiel für eine Version der get_permalink()
Funktion in wp-includes/link-template.php
. Es werden benutzerdefinierte Post-Permalinks generiert, von get_post_permalink()
denen eine stark verwässerte Version von ist get_permalink()
. get_post_permalink()
wird durch gefiltert, post_type_link
so dass wir das verwenden, um eine benutzerdefinierte Permastruktur zu erstellen.
// 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;
}
Wie bereits erwähnt, handelt es sich um einen sehr vereinfachten Fall zum Generieren eines benutzerdefinierten Regelsatzes und von Permalinks für das Neuschreiben. Er ist nicht besonders flexibel, sollte jedoch ausreichen, um den Einstieg zu erleichtern.
Betrug
Ich habe ein Plugin geschrieben, mit dem Sie Permastrukturen für jeden benutzerdefinierten Beitragstyp definieren können, aber wie Sie es %category%
in der Permalink-Struktur für Beiträge verwenden können, die mein Plugin %custom_taxonomy_name%
für alle benutzerdefinierten Taxonomien unterstützt, die Sie auch haben, wobei custom_taxonomy_name
der Name Ihrer Taxonomie z. %club%
.
Es funktioniert wie erwartet mit hierarchischen / nicht hierarchischen Taxonomien.
http://wordpress.org/extend/plugins/wp-permastructure/