Alterar slug da base do autor para diferentes funções

9

É possível alterar a lesma da base do autor de acordo com seu papel? Por exemplo, os autores obtêm example.com/ninja/%username% e os assinantes obtêm example.com/trainee/%username%?

Estou pensando em algo como:

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

Ele deve funcionar para visitantes não registrados se eles navegarem no site e deve funcionar para os autores conectados e os próprios assinantes.

Maxim Zubarev
fonte
Este plugin faz o que você procura. Se você não quiser usar um plug-in, poderá encontrar a resposta para sua pergunta no código-fonte.
Supajb
Eu acho que não é possível tocar na base de autores. Você precisará configurar uma regra de reescrita separada e filtrar o link permanente do autor.
fuxia

Respostas:

9

No seu exemplo, o autor reescreve as alterações de padrão de /author/[authorname]/para /[author_level]/[author_name]/. Se permitirmos [author_level]qualquer coisa, entraremos em conflito com as regras das páginas, porque /[anything]/[anything]/pode ser um arquivo de autor ou uma subpágina regular.

Por esse motivo, minha solução supõe que você tenha um número limitado de níveis de autor, para que possamos explicitamente colocá-los nas regras de reescrita. Então, /ninja/[anything]/será um arquivo de autor, mas /not-ninja/[anything]/será uma página regular.

Alterar a estrutura da URL sempre consiste em duas partes: alterar as URLs que o WordPress aceitará e alterar as URLs que o WordPress irá gerar. Primeiro, alteraremos os URLs que o WordPress aceitará, introduzindo uma nova marca de reescrita e definindo nossa base de autores para essa marca.

// 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 você verificar as regras de reescrita resultantes com o meu Rewrite Analyzer , notará que ele contém regras extras para as /[author-level]/páginas comuns . Isso acontece porque o WordPress gera regras para cada parte do diretório que contém uma tag de reescrita, como %author_level%. Não precisamos disso, portanto, filtre todas as regras de reescrita de autores que não contenham 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;
}

Agora, o WordPress deve aceitar URLs usando esse novo padrão. A única coisa que resta a fazer é alterar os URLs que ele gera quando cria um link para um arquivo de autor. Para isso, você pode conectar-se ao author_linkfiltro, como este exemplo muito básico:

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
fonte
Mas não são trainee/john/e ninja/john/agora ambos os URIs válidos para o mesmo autor? Não há como criar um permalink canônico para um autor apenas alterando as regras de reescrita, certo? A user_metapoderia ajudar ...
fuxia
Sim, ambos são válidos, mas se você usar as funções padrão, apenas uma delas será vinculada, através do author_linkfiltro. Você também pode adicionar uma "verificação canônica" extra, assim como o núcleo redirect_canonical(), se você realmente se importa com isso. Não sei como user_metavai ajudar aqui? Meu author_linkexemplo é muito simples, ele precisa de lógica específica do site para separar os ninjas dos treinandos.
Jan Fabry
Ainda é uma solução muito boa, muito obrigado! o que você quer dizer com lógica específica do site?
Maxim Zubarev
@dotwired: Bem, porque eu não sei como o seu site define quais usuários são ninjas e quais são estagiários, você terá que concluir esse author_linkfiltro por conta própria. (Na verdade, você disse a ele - Autores são ninjas e Assinantes são estagiários -, mas meu código deve ser suficiente para completar a operação e ser suficientemente genérica para que outros possam aprender com ele também.)
Jan Fabry
É author_rewrite_rulesexecutado em todas as páginas carregadas?
henrywright