In Ihrem Beispiel ändert sich der Autor Rewrite - Muster aus /author/[authorname]/
zu /[author_level]/[author_name]/
. Wenn wir etwas zulassen [author_level]
, geraten wir in Konflikt mit den Regeln für Seiten, da /[anything]/[anything]/
es sich entweder um ein Autorenarchiv oder eine reguläre Unterseite handeln kann.
Aus diesem Grund geht meine Lösung davon aus, dass Sie eine begrenzte Anzahl von Autorenebenen haben, sodass wir sie explizit in die Umschreiberegeln aufnehmen können. Es /ninja/[anything]/
wird also ein Autorenarchiv sein, aber es /not-ninja/[anything]/
wird eine reguläre Seite sein.
Das Ändern der URL-Struktur besteht immer aus zwei Teilen: Ändern der von WordPress akzeptierten URLs und Ändern der von WordPress generierten URLs. Zuerst ändern wir die URLs, die WordPress akzeptiert, indem wir ein neues Rewrite-Tag einführen und unsere Autorenbasis auf dieses Tag setzen.
// I assume you define these somewhere, this is just to make the example work
$wpse17106_author_levels = array( 'trainee', 'ninja' );
add_action( 'init', 'wpse17106_init' );
function wpse17106_init()
{
global $wp_rewrite;
$author_levels = $GLOBALS['wpse17106_author_levels'];
// Define the tag and use it in the rewrite rule
add_rewrite_tag( '%author_level%', '(' . implode( '|', $author_levels ) . ')' );
$wp_rewrite->author_base = '%author_level%';
}
Wenn Sie die resultierenden Umschreiberegeln mit meinem Rewrite Analyzer überprüfen, werden Sie feststellen, dass er zusätzliche Regeln für die einfachen /[author-level]/
Seiten enthält. Dies geschieht, weil WordPress Regeln für jeden Verzeichnisteil generiert, der ein Umschreibetag enthält, wie z %author_level%
. Wir brauchen diese nicht, also filtern Sie alle Regeln zum Umschreiben von Autoren heraus, die kein author_name
:
add_filter( 'author_rewrite_rules', 'wpse17106_author_rewrite_rules' );
function wpse17106_author_rewrite_rules( $author_rewrite_rules )
{
foreach ( $author_rewrite_rules as $pattern => $substitution ) {
if ( FALSE === strpos( $substitution, 'author_name' ) ) {
unset( $author_rewrite_rules[$pattern] );
}
}
return $author_rewrite_rules;
}
Jetzt sollte WordPress URLs mit diesem neuen Muster akzeptieren. Sie müssen nur noch die URLs ändern, die beim Erstellen eines Links zu einem Autorenarchiv generiert werden. Dafür können Sie sich in den author_link
Filter einhängen , wie in diesem sehr einfachen Beispiel:
add_filter( 'author_link', 'wpse17106_author_link', 10, 2 );
function wpse17106_author_link( $link, $author_id )
{
if ( 1 == $author_id ) {
$author_level = 'ninja';
} else {
$author_level = 'trainee';
}
$link = str_replace( '%author_level%', $author_levels, $link );
return $link;
}