Cambia la lumaca di base dell'autore per ruoli diversi


9

È possibile cambiare la lumaca di base dell'autore in base al suo ruolo? Ad esempio, gli autori ottengono example.com/ninja/%username% e gli abbonati ottengono example.com/trainee/%username%?

Sto pensando a qualcosa di simile:

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

Dovrebbe funzionare per i visitatori non registrati se navigano nel sito e dovrebbe funzionare per gli autori e gli abbonati registrati.


Questo plugin fa quello che stai cercando. Se non desideri utilizzare un plug-in, potresti essere in grado di trovare la risposta alla tua domanda nel codice sorgente.
supajb,

Penso che non sia possibile toccando la base degli autori. Dovrai impostare una regola di riscrittura separata e filtrare il permalink dell'autore.
fuxia

Risposte:


9

Nel tuo esempio, l'autore riscrive lo schema cambia da /author/[authorname]/a /[author_level]/[author_name]/. Se permettiamo [author_level]di essere qualsiasi cosa, entreremo in conflitto con le regole per le pagine, perché /[anything]/[anything]/può essere un archivio autore o una sottopagina regolare.

Per questo motivo, la mia soluzione presuppone che tu abbia un numero limitato di livelli di autore, quindi possiamo esplicitamente inserirli nelle regole di riscrittura. Quindi /ninja/[anything]/sarà un archivio autore, ma /not-ninja/[anything]/sarà una pagina normale.

La modifica della struttura dell'URL consiste sempre di due parti: la modifica degli URL accettati da WordPress e la modifica degli URL generati da WordPress. Per prima cosa cambieremo gli URL che WordPress accetterà introducendo un nuovo tag di riscrittura e impostando la nostra base di autori su quel tag.

// 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%';
}

Se controlli le regole di riscrittura risultanti con il mio Analizzatore di riscrittura noterai che contiene regole extra per le /[author-level]/pagine semplici . Ciò accade perché WordPress genera regole per ogni parte della directory che contiene un tag di riscrittura, come %author_level%. Non ne abbiamo bisogno, quindi filtra tutte le regole di riscrittura dell'autore che non contengono un 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;
}

Ora WordPress dovrebbe accettare gli URL usando questo nuovo modello. L'unica cosa che resta da fare è cambiare gli URL che genera quando crea un collegamento a un archivio autore. Per questo puoi agganciarti al author_linkfiltro, come in questo esempio molto semplice:

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

Ma non sono trainee/john/e ninja/john/ora entrambi gli URI validi per lo stesso autore? Non c'è modo di creare un permalink canonico per un autore solo modificando le regole di riscrittura, giusto? A user_metapotrebbe aiutare ...
fuxia

Sì, sono entrambi validi, ma se si utilizzano le funzioni standard solo una di esse sarà collegata, tramite il author_linkfiltro. Puoi anche aggiungere un ulteriore "controllo canonico" proprio come fa il core redirect_canonical(), se ti interessa davvero. Non so come user_metasarà d'aiuto qui? Il mio author_linkesempio è troppo semplice, ha bisogno di una logica specifica del sito per separare i ninja dai tirocinanti.
Jan Fabry,

Questa è ancora una soluzione davvero bella, grazie mille! cosa intendi con logica site specific?
Maxim Zubarev,

@dotwired: Beh, perché non so come il tuo sito definisce quali utenti sono ninja e quali sono i tirocinanti, dovrai completare author_linktu stesso quel filtro. (In realtà l'hai detto - Gli autori sono ninja e gli abbonati sono tirocinanti - ma il mio codice dovrebbe essere sufficiente per completare quella parte ed essere abbastanza generico in modo che anche altri possano imparare da essa.)
Jan Fabry

Funziona author_rewrite_rulessu ogni pagina caricata?
henrywright,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.