Cómo crear un perfil de usuario frontal con un enlace permanente amigable

21

Quiero crear una página de perfil de front-end público 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!

    
pregunta tiltdown 16.07.2012 - 17:47

4 respuestas

14

He descubierto dos formas de hacer esto:

  1. Página de autor con una regla de reescritura personalizada
  2. Archivos de plantillas personalizadas emparejados con una regla de reescritura

El primero es más simple de implementar, pero puede que no funcione 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 puedes usar la plantilla incorporada author.php, modificando a tu gusto.

Sinceramente, revise el enlace que se menciona arriba, ya que Jan Fabry hace un excelente trabajo explicando todo.

Vars de consulta y plantillas de página

Para el tema en el que estaba trabajando mientras descubría estas soluciones, necesitaba servir una página personalizada basada en un valor meta del usuario (una identificación separada). 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 consultar por meta claves / valores. Afortunadamente, había una solución.

En tu 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 var. de consulta.

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

Una vez que haya hecho esto, simplemente necesita "capturar" cuando se está sirviendo la consulta var, y luego redirigir a la plantilla de su elección:

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 la "ID de usuario pública" con el id_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 soluciones son válidas y funcionan. El segundo ofrece una capa separada de "seguridad", ya que no revela las ID de usuario ni los nombres de usuario, si otras personas pueden navegar por los perfiles.

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

    
respondido por el bybloggers 17.07.2012 - 20:07
2

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

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

    
respondido por el Poxtron 14.03.2013 - 01:33
1

Este es mi código de trabajo basado en la respuesta de @bybloggers (gracias por cierto) Me acabo de enterar de que no deberíamos usar el enlace de redirección de plantilla 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í: enlace

Por lo tanto, deberíamos estar utilizando el enlace template_include. Con este gancho, no es necesario utilizar 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;
    }

}
    
respondido por el Carlos B 08.09.2015 - 09:57
0

Otra forma es usar Buddypress que tiene este incorporado, incluso si el complemento tiene aún más funciones que pueden no ser de su interés.

enlace

    
respondido por el Jens Wedin 17.07.2012 - 22:16

Lea otras preguntas en las etiquetas