Change Author Base Slug für verschiedene Rollen

Ist es möglich, den Autor-Basis-Slug in Abhängigkeit von der Rolle zu ändern? Zum Beispiel erhalten Autoren example.com/ninja/%username% und Abonnenten erhalten example.com/trainee/%username%? Ich denke an etwas wie:

add_action('init', 'set_new_author_base'); function set_new_author_base() { global $wp_rewrite; if($user->role == 'subscriber') $author_slug = 'trainee'; $wp_rewrite->author_base = $author_slug; } elseif($user->role == 'author') { $author_slug = 'ninja'; $wp_rewrite->author_base = $author_slug; } } 

Aber ich bin ein bisschen verzweifelt wegen der If-Linie. Es sollte für nicht registrierte Besucher funktionieren, wenn sie die Seite durchsuchen und die Autor-Links sehen, es sollte für die eingeloggten Autoren und Abonnenten selbst funktionieren …. Ich schätze jede Hilfe!

Solutions Collecting From Web of "Change Author Base Slug für verschiedene Rollen"

In Ihrem Beispiel /author/[authorname]/ der Autor die Musteränderungen von /author/[authorname]/ nach /[author_level]/[author_name]/ . Wenn wir [author_level] erlauben, [author_level] zu sein, geraten wir in Konflikt mit den Regeln für Seiten, weil /[anything]/[anything]/ entweder ein Autorenarchiv oder eine reguläre Unterseite sein kann.

Aus diesem Grund geht meine Lösung davon aus, dass Sie eine begrenzte Anzahl von Autorenebenen haben, sodass wir sie explizit in die Neuschreibungsregeln aufnehmen können. So /ninja/[anything]/ wird ein Autorenarchiv sein, aber /not-ninja/[anything]/ wird eine reguläre Seite sein.

Das Ändern der URL-Struktur besteht immer aus zwei Teilen: Ändern der URLs, die WordPress akzeptiert, und Ändern der von WordPress generierten URLs. Zuerst werden wir die URLs ändern, 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 Rewrite-Regeln mit meinem Rewrite Analyzer überprüfen, werden Sie feststellen, dass sie zusätzliche Regeln für die einfachen /[author-level]/ Seiten enthält. Dies geschieht, weil WordPress Regeln für jeden Verzeichnisteil generiert, der ein Rewrite-Tag enthält, wie zum Beispiel %author_level% . Wir brauchen diese nicht, also filtern Sie alle Autor-Umschreibungsregeln aus, die keinen Autorennamen enthalten:

 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. Dazu können Sie wie in diesem sehr einfachen Beispiel den Filter ” author_link :

 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; }