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


23

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

mysite.com/user/someusername

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

Obrigado!

Respostas:


15

Há duas maneiras que eu descobri fazendo isso:

  1. Página de autor com uma regra de reescrita personalizada
  2. Arquivos de modelo personalizados emparelhados com uma regra de reescrita

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

Regra de reconfiguraçã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.

Vars de consulta e modelos de página

Para o tema em que estava trabalhando ao descobrir essas soluções, eu precisava veicular 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 estivesse visível publicamente, por isso criamos uma camada separada.

O único problema? No momento, não há uma maneira clara de como usar a API Rewrite para consultar por meta chaves / valores. Felizmente, havia 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 então, você precisa criar uma nova marca e regra de reescrita para que ele saiba 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, basta "capturar" quando a consulta var estiver sendo veiculada 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 o user-profile.php.

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

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

get_header( 'user' );

O qual chamará o arquivo header-user.php.

Conclusão

Ambos são soluções válidas e funcionais. 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ê tiver alguma dúvida.


Na verdade, eu o resolvi usando o método Query_var. Obrigado!
Tiltdown

1
@bybloggers Eu sei que este post é um pouco antigo, mas estava curioso para compartilhar sua terceira função por passar o nome de usuário no URL para o modelo?
Pat

@ Pat Não tenho certeza de onde a função real está em todo o meu código neste momento (como você disse, foi há algum tempo atrás), mas o formato seguiria a função wpleet_rewrite_catch () muito de perto. Em vez de array_key_exists ('user'), eu estava testando o ID do usuário público e fazendo uma pesquisa na tabela wp_usermeta para ver qual usuário tinha esse ID público associado a ele. Espero que o algoritmo ajude, mesmo que o código não esteja disponível.
fácil

2

Encontrei isso hoje cedo e fiz algumas modificações no código @bybloggers com a diferença de que, em vez de usar o 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 usá-lo nesse 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 <- inglês


Muito agradável! Obrigado por compartilhar isso. Gostaria de tornar mais dinâmico e você pode mudar o ID com get_page_by_path('page-slug')->ID. Também não se esqueça de usar flush_rewrite_rules, por isso gostaria de acrescentar:add_action( 'after_switch_theme', 'flush_rewrite_rules' );
Leo Caseiro 28/08

1

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

A explicação está aqui: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

Portanto, devemos usar o gancho template_include. Com esse 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;
    }

}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.