Como criar um perfil de usuário front-end com um permalink amigável

21

Eu quero criar uma página de perfil público de front-end com um URL amigável como este formato.

mysite.com/user/someusername

Alguma ideia de como posso conseguir isso? Eu sei que tem algo a ver com reescrever regra, mas eu não tenho idéia de como posso fazer isso. Se você tem algum link ou tutorial para mim, será ótimo.

Obrigado!

    
por tiltdown 16.07.2012 / 17:47

4 respostas

14

Existem duas maneiras de descobrir isso:

  1. Author Page com uma regra de reescrita personalizada
  2. Um arquivo de modelo personalizado emparelhado com uma regra de reconfiguração

O primeiro é mais simples de implementar, mas pode não funcionar em todas as circunstâncias (uma das quais descreverei em breve).

Regra de Regravação Personalizada

Encontrei esta solução há alguns dias aqui: Reescrita de URL

E aqui está o código, com comentários:

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

Você pode usar o modelo author.php incorporado, modificando o conteúdo do seu coração.

Atenciosamente, verifique o link listado acima, pois Jan Fabry faz um excelente trabalho explicando tudo.

Query Vars e modelos de páginas

Para o tema em que estava trabalhando durante a descoberta dessas soluções, eu precisava servir uma página personalizada com base em um meta valor do usuário (um ID separado). Meu cliente não queria que o nome de usuário ou o ID do usuário ficasse visível publicamente, então criamos uma camada separada.

O único problema? No momento, não há uma maneira clara de como usar a API de reconfiguração para consultar por meta chaves / valores. Felizmente, houve uma solução.

No seu arquivo 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;
}

E, em seguida, você precisa criar uma nova tag e regra de reescrita para saber quando e como lidar com a nova consulta var.

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

Depois de fazer isso, você só precisa "pegar" quando a consulta var está sendo exibida e, em seguida, redirecionar para o modelo de sua escolha:

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

Apenas certifique-se de ter criado user-profile.php.

No meu próprio exemplo, criei uma terceira função que correspondia ao "ID do usuário público" para o user_id real por meio da tabela $ wpdb- > usermeta e passava as informações para o modelo.

Se você precisar criar um modelo diferente do restante do tema, lembre-se de que, com get_header, você pode especificar um nome:

get_header( 'user' );

Que irá chamar o arquivo header-user.php.

Conclusão

Ambos são soluções de trabalho válidas. O segundo oferece uma camada separada de "segurança", pois não revela IDs de usuário ou nomes de usuário, se outras pessoas puderem navegar pelos perfis.

Espero que ajude, deixe-me saber se você tem alguma dúvida.

    
por bybloggers 17.07.2012 / 20:07
2

Encontrei isso hoje cedo e fiz algumas modificações no código @bybloggers com a diferença de que, em vez de usar template_redirect, altero a solicitação para mostrar uma página estática, o que significa que agora você pode adicionar o que quiser a um modelo de página e usar nessa 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();

espanhol - > usuario = usuário < - English

    
por Poxtron 14.03.2013 / 01:33
1

Este é o meu código de trabalho baseado na resposta @bybloggers (obrigado, por sinal) Acabei de aprender que não devemos usar o template_redirect hook e depois sair do php, porque algumas coisas podem parar de funcionar porque a interrupção abrupta do código de execução do php.

A explicação está aqui: enlace

Então, deveríamos estar usando o gancho template_include. Com este gancho, não há necessidade de usar o método de redirecionamento e saída.

E a outra diferença é que eu só precisava de www.server.com/myaccount sem o / userid.

Este é o 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;
    }

}
    
por Carlos B 08.09.2015 / 09:57
0

Outra maneira é usar o Buddypress, que tem este built-in, mesmo que o plugin tenha ainda mais funcionalidades que podem não ser de interesse.

enlace

    
por Jens Wedin 17.07.2012 / 22:16