Cambiar la babosa base del autor para diferentes roles


9

¿Es posible cambiar la babosa base del autor de acuerdo con su papel? Por ejemplo, los autores obtienen example.com/ninja/%username% y los suscriptores obtienen example.com/trainee/%username%?

Estoy pensando en 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;
  }
}

Debería funcionar para los visitantes no registrados si navegan por el sitio y debería funcionar para los autores y suscriptores registrados.


Este complemento hace lo que buscas. Si no desea utilizar un complemento, puede encontrar la respuesta a su pregunta en el código fuente.
supajb

Creo que no es posible tocando la base del autor. Tendrá que configurar una regla de reescritura separada y filtrar el enlace permanente del autor.
fuxia

Respuestas:


9

En su ejemplo, el autor reescribe los cambios de patrón de /author/[authorname]/a /[author_level]/[author_name]/. Si permitimos [author_level]que haya algo, entraremos en conflicto con las reglas de las páginas, ya que /[anything]/[anything]/puede ser un archivo de autor o una subpágina normal.

Por esta razón, mi solución asume que tiene un número limitado de niveles de autor, por lo que podemos ponerlos explícitamente en las reglas de reescritura. Entonces /ninja/[anything]/será un archivo de autor, pero /not-ninja/[anything]/será una página normal.

Cambiar la estructura de la URL siempre consta de dos partes: cambiar las URL que WordPress aceptará y cambiar las URL que generará WordPress. Primero, cambiaremos las URL que WordPress aceptará introduciendo una nueva etiqueta de reescritura y configurando nuestra base de autores para esa etiqueta.

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

Si verifica las reglas de reescritura resultantes con mi Analizador de reescritura , notará que contiene reglas adicionales para las /[author-level]/páginas simples . Esto sucede porque WordPress genera reglas para cada parte del directorio que contiene una etiqueta de reescritura, como %author_level%. No los necesitamos, así que filtre todas las reglas de reescritura de autores que no contengan 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;
}

Ahora WordPress debería aceptar URL usando este nuevo patrón. Lo único que queda por hacer es cambiar las URL que genera cuando crea un enlace a un archivo de autor. Para eso, puede conectarlo al author_linkfiltro, como este ejemplo muy 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;
}

¿Pero no son trainee/john/y ninja/john/ahora ambos URI válidos para el mismo autor? No hay forma de crear un enlace permanente canónico para un autor simplemente cambiando las reglas de reescritura, ¿verdad? A user_metapodría ayudar ...
fuxia

Sí, ambos son válidos, pero si utiliza las funciones estándar, solo se vinculará una de ellas a través del author_linkfiltro. También puede agregar un "chequeo canónico" extra al igual que lo hace el núcleo redirect_canonical(), si realmente le importa esto. No sé cómo user_metaayudará aquí? Mi author_linkejemplo es demasiado simple, necesita una lógica específica del sitio para separar a los ninjas de los aprendices.
Jan Fabry

Esta sigue siendo una buena solución, ¡muchas gracias! ¿Qué quieres decir con lógica específica del sitio?
Maxim Zubarev

@dotwired: Bueno, debido a que no sé cómo su sitio define qué usuarios son ninjas y cuáles son aprendices, deberá completar ese author_linkfiltro usted mismo. (En realidad, lo dijiste, los autores son ninjas y los suscriptores son aprendices, pero mi código debería ser suficiente para completar esa parte y ser lo suficientemente genérico para que otros también puedan aprender de él)
Jan Fabry,

¿Se author_rewrite_rulesejecuta en cada página de carga?
henrywright
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.