Cómo crear un perfil de usuario front-end con un enlace permanente amigable

23

Quiero crear una página pública de perfil de usuario con una URL amigable como este formato.

mysite.com/user/someusername

¿Alguna idea de cómo puedo lograr esto? Sé que tiene algo que ver con la regla de reescritura, pero no tengo idea de cómo puedo hacer eso. Si tienes algún enlace o tutorial para mí, será genial.

¡Gracias!

inclinar hacia abajo
fuente

Respuestas:

15

Hay dos formas en que he descubierto esto:

  1. Página de autor con una regla de reescritura personalizada
  2. Un archivo de plantilla personalizado emparejado con una regla de reescritura

El primero es más simple de implementar, pero puede no funcionar en todas las circunstancias (una de las cuales describiré pronto).

Regla de reescritura personalizada

Encontré esta solución hace unos días aquí: reescritura de URL

Y aquí está el código, con comentarios:

// Define the author levels you want to use
$custom_author_levels = array( 'user', 'leader' );

// On init, add a new author_level rewrite tag and add it to the author_base property of wp_rewrite
add_action( 'init', 'wpleet_init' );
function wpleet_init()
{
    global $wp_rewrite;
    $author_levels = $GLOBALS['custom_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%';

}

// The previous function creates extra author_name rewrite rules that are unnecessary.  
//This function tests for and removes them

add_filter( 'author_rewrite_rules', 'wpleet_author_rewrite_rules' );
function wpleet_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;
}

Luego puede usar la plantilla incorporada author.php, modificando el contenido de su corazón.

Sinceramente, revise el enlace mencionado anteriormente, ya que Jan Fabry hace un excelente trabajo explicando todo.

Consultar Vars y plantillas de página

Para el tema en el que estaba trabajando mientras descubría estas soluciones, necesitaba publicar una página personalizada basada en un metavalor del usuario (un ID por separado). Mi cliente no quería que el nombre de usuario o la ID de usuario fueran visibles públicamente, por lo que creamos una capa separada.

¿El único problema? Por el momento, no hay una forma clara de cómo utilizar la API de reescritura para realizar consultas por meta claves / valores. Afortunadamente, había una solución.

En su archivo functions.php ...

// Create the query var so that WP catches your custom /user/username url
add_filter( 'query_vars', 'wpleet_rewrite_add_var' );
function wpleet_rewrite_add_var( $vars )
{
    $vars[] = 'user';
    return $vars;
}

Y luego, debe crear una nueva etiqueta y regla de reescritura para que sepa cuándo y cómo manejar la nueva consulta var.

add_rewrite_tag( '%user%', '([^&]+)' );
add_rewrite_rule(
    '^user/([^/]*)/?',
    'index.php?user=$matches[1]',
    'top'
);

Una vez que haya hecho esto, simplemente necesita "atrapar" cuando se está sirviendo la consulta var, y luego redirigir a la plantilla que elija:

add_action( 'template_redirect', 'wpleet_rewrite_catch' );
function wpleet_rewrite_catch()
{
    global $wp_query;

    if ( array_key_exists( 'user', $wp_query->query_vars ) ) {
        include (TEMPLATEPATH . '/user-profile.php');
        exit;
    }
}

Solo asegúrate de haber creado user-profile.php.

En mi propio ejemplo, creé una tercera función que coincidía con el "ID de usuario público" con el ID de usuario real a través de la tabla $ wpdb-> usermeta, y pasé la información a la plantilla.

Si necesita crear una plantilla diferente del resto de su tema, recuerde que con get_header, puede especificar un nombre:

get_header( 'user' );

Que llamará al archivo header-user.php.

Conclusión

Ambas son soluciones válidas que funcionan. El segundo ofrece una capa separada de "seguridad", ya que no revela ID de usuario o nombres de usuario, si otras personas podrán navegar por los perfiles.

Espero que ayude, avíseme si tiene alguna pregunta.

bybloggers
fuente
De hecho, lo resolví usando el método Query_var. ¡Gracias!
tiltdown
1
@bybloggers Sé que esta publicación es un poco antigua, pero tenía curiosidad por saber si podría compartir su tercera función para pasar el nombre de usuario en la URL a la plantilla.
Pat
@Pat No estoy seguro de dónde está la función real en todo mi código en este momento (como dijiste, fue hace un tiempo), pero el formato seguiría muy de cerca la función wpleet_rewrite_catch (). En lugar de array_key_exists ('usuario'), estaba probando la ID de usuario pública y luego haciendo una búsqueda en la tabla wp_usermeta para ver qué usuario tenía esa ID pública asociada. Espero que el algoritmo ayude, incluso si el código no está disponible.
bybloggers
2

Encontré esto hoy e hice algunas modificaciones al código @bybloggers con la diferencia de que en lugar de usar template_redirect, cambio la solicitud para mostrar una página estática, eso significa que ahora puede agregar lo que quiera a una plantilla de página y usarla en ese página.

class ProfilePage {
function __construct() {
    add_filter( 'init',array($this,'rw_init'));
    add_filter( 'query_vars', array($this,'wpleet_rewrite_add_var') );
    add_filter( 'request', array($this,'change_requests'));
}
function wpleet_rewrite_add_var( $vars ) {
    $vars[] = 'usuario';
    return $vars;
}
function rw_init(){
    add_rewrite_tag( '%usuario%', '([^&]+)' );
    add_rewrite_rule(
        '^usuario/([^/]*)/?',
        'index.php?usuario=$matches[1]',
        'top'
    );
}
function change_requests($query_vars) {
    //go to a specific page when the usuario key is set
    $query_vars['page_id'] = isset($query_vars['usuario']) ? 7581 : $query_vars['page_id'];
    return $query_vars;
}
}
new ProfilePage();

Español -> usuario = usuario <- Inglés

Poxtron
fuente
¡Muy agradable! Gracias por compartir eso. Me gustaría hacer más dinámico y puede cambiar la identificación con get_page_by_path('page-slug')->ID. Tampoco olvides el uso flush_rewrite_rules, así que agregaría como:add_action( 'after_switch_theme', 'flush_rewrite_rules' );
Leo Caseiro
1

Este es mi código de trabajo basado en la respuesta de @bybloggers (gracias, por cierto), acabo de enterarme de que no deberíamos usar template_redirect hook y luego salir de php, porque algunas cosas pueden dejar de funcionar debido a la interrupción abrupta del código de ejecución de php.

La explicación está aquí: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

Entonces, deberíamos estar usando el gancho template_include. Con este enlace, no es necesario usar el método de redireccionamiento y salida.

Y la otra diferencia es que solo necesitaba www.server.com/myaccount sin el / userid.

Este es el código:

add_filter( 'query_vars', 'wp58683_userprofile_var' );
function wp58683_userprofile_var( $vars )
{
    $vars[] = 'myprofile';
    return $vars;
}

add_rewrite_tag( '%myprofile%', '([^&]+)' );

add_rewrite_rule(
    '^myprofile/?',
    'index.php?myprofile',
    'top'
);

add_action( 'template_include', 'wp58683_userprofile_page' );
function wp58683_userprofile_page($original_template)
{
    global $wp_query;

    if ( array_key_exists( 'myprofile', $wp_query->query_vars ) ) {
        if (is_user_logged_in() ){ 
            return TEMPLATEPATH . '/user-profile.php';
        }
    }
    else {
        return $original_template;
    }

}
Carlos B
fuente