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.