Ändern Sie die Autorenbasis für verschiedene Rollen

9

Ist es möglich, die Basisbasis des Autors entsprechend seiner Rolle zu ändern? Zum Beispiel erhalten Autoren example.com/ninja/%username% und Abonnenten 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;
  }
}

Es sollte für nicht registrierte Besucher funktionieren, wenn sie die Website durchsuchen, und es sollte für die angemeldeten Autoren und Abonnenten selbst funktionieren.

Maxim Zubarev
quelle
Dieses Plugin macht das, wonach Sie suchen. Wenn Sie kein Plugin verwenden möchten, finden Sie möglicherweise die Antwort auf Ihre Frage im Quellcode.
Supajb
Ich denke, es ist nicht möglich, die Autorenbasis zu berühren. Sie müssen eine separate Umschreiberegel einrichten und den Autorenpermalink filtern.
Fuxia

Antworten:

9

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_linkFilter 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;
}
Jan Fabry
quelle
Aber sind trainee/john/und sind nicht ninja/john/beide URIs für denselben Autor gültig? Es gibt keine Möglichkeit, einen kanonischen Permalink für einen Autor zu erstellen, indem Sie einfach die Umschreiberegeln ändern, oder? A user_metakönnte helfen ...
Fuxia
Ja, beide sind gültig, aber wenn Sie die Standardfunktionen verwenden, wird nur eine davon über den author_linkFilter verknüpft . Sie können auch einen zusätzlichen "kanonischen Check" hinzufügen, genau wie der Kern redirect_canonical(), wenn Sie sich wirklich dafür interessieren. Ich weiß nicht, wie user_metaich hier helfen kann. Mein author_linkBeispiel ist zu einfach, es benötigt eine ortsspezifische Logik, um die Ninjas von den Auszubildenden zu trennen.
Jan Fabry
Dies ist immer noch eine wirklich schöne Lösung, vielen Dank! Was meinst du mit ortsspezifischer Logik?
Maxim Zubarev
@dotwired: Nun, da ich nicht weiß, wie Ihre Website definiert, welche Benutzer Ninjas und welche Auszubildende sind, müssen Sie diesen author_linkFilter selbst ausfüllen. (Eigentlich haben Sie es gesagt - Autoren sind Ninjas und Abonnenten sind Auszubildende - aber mein Code sollte ausreichen, um diesen Teil zu vervollständigen und allgemein genug zu sein, damit auch andere daraus lernen können.)
Jan Fabry
Läuft author_rewrite_rulesauf jeder Seite geladen?
Henrywright