Cum să creezi un profil de utilizator cu permalink prietenos în front-end

16 iul. 2012, 18:47:28
Vizualizări: 18.6K
Voturi: 24

Vreau să creez o pagină publică de profil în front-end cu un URL prietenos în acest format:

siteulmeu.com/utilizator/username

Ai vreo idee cum pot realiza asta? Știu că are legătură cu regulile de rescriere (rewrite rules) dar nu știu exact cum să procedez. Dacă ai vreun link sau tutorial pentru mine, ar fi minunat.

Mulțumesc!

0
Toate răspunsurile la întrebare 4
3
15

Am descoperit două metode de a face acest lucru:

  1. Pagină de autor cu o regulă personalizată de rescriere
  2. Fișiere șablon personalizate împerecheate cu o regulă de rescriere

Prima este mai simplu de implementat, dar poate să nu funcționeze în toate situațiile (una dintre acestea voi descrie în curând).

Regulă Personalizată de Rescriere

Am găsit această soluție acum câteva zile aici: URL Rewriting

Și iată codul, cu comentarii:

// Definește nivelurile de autor pe care dorești să le folosești
$custom_author_levels = array( 'user', 'leader' );

// La inițializare, adaugă un nou tag de rescriere author_level și îl adaugă la proprietatea author_base a wp_rewrite
add_action( 'init', 'wpleet_init' );
function wpleet_init()
{
    global $wp_rewrite;
    $author_levels = $GLOBALS['custom_author_levels'];

    // Definește tag-ul și îl folosește în regula de rescriere
    add_rewrite_tag( '%author_level%', '(' . implode( '|', $author_levels ) . ')' );
    $wp_rewrite->author_base = '%author_level%';

}

// Funcția anterioară creează reguli inutile de rescriere pentru author_name.  
//Această funcție le testează și le elimină

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

Poți apoi folosi șablonul încorporat author.php, modificându-l după dorință.

Recomand să verifici link-ul menționat mai sus, deoarece Jan Fabry explică excelent totul.

Variabile de Interogare și Șabloane de Pagină

Pentru tema la care lucram în timp ce descopeream aceste soluții, aveam nevoie să servesc o pagină personalizată bazată pe o valoare meta a utilizatorului (un ID separat). Clientul meu nu dorea ca numele de utilizator sau ID-ul să fie vizibile public, așa că am creat un strat separat.

Singura problemă? În acest moment, nu există o metodă clară de a folosi Rewrite API pentru a interoga după chei/valori meta. Din fericire, exista o soluție.

În fișierul functions.php...

// Creează variabila de interogare astfel încât WP să captureze URL-ul personalizat /user/username
add_filter( 'query_vars', 'wpleet_rewrite_add_var' );
function wpleet_rewrite_add_var( $vars )
{
    $vars[] = 'user';
    return $vars;
}

Apoi, trebuie să creezi un nou tag și o regulă de rescriere astfel încât să știe când și cum să gestioneze noua variabilă de interogare.

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

După ce ai făcut acest lucru, trebuie doar să "prinzi" momentul în care variabila de interogare este servită și apoi să redirecționezi către șablonul ales:

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

Asigură-te că ai creat user-profile.php.

În exemplul meu, am creat o a treia funcție care potrivea "ID-ul public al Utilizatorului" cu user_id real prin tabelul $wpdb->usermeta și transmitea informațiile către șablon.

Dacă ai nevoie să creezi un șablon diferit de restul temei, amintește-ți că cu get_header, poți specifica un nume:

get_header( 'user' );

Care va apela fișierul header-user.php.

Concluzie

Ambele sunt soluții valide și funcționale. A doua oferă un strat separat de "securitate" deoarece nu dezvăluie ID-uri sau nume de utilizatori, dacă alți oameni vor putea naviga pe profile.

Sper că te ajută, dacă ai întrebări, lasă un comentariu.

17 iul. 2012 21:07:42
Comentarii

Am rezolvat de fapt folosind metoda Query_var. Mulțumesc!

tiltdown tiltdown
18 iul. 2012 03:36:50

@bybloggers Știu că acest post este puțin vechi, dar eram curios dacă poți să împărtășești a treia funcție pentru a transmite numele de utilizator din URL către șablon?

Pat Pat
17 mar. 2013 05:22:49

@Pat Nu sunt sigur unde se află funcția efectivă în tot codul meu în acest moment (după cum ai spus, a fost acum ceva timp), dar formatul ar urma foarte îndeaproape funcția wpleet_rewrite_catch(). În loc de array_key_exists( 'user' ), testam pentru ID-ul public al utilizatorului, apoi căutam în tabelul wp_usermeta pentru a vedea care utilizator avea acel ID public asociat. Sper ca algoritmul să te ajute, chiar dacă codul nu este disponibil.

bybloggers bybloggers
4 apr. 2013 02:34:01
1

Am găsit asta mai devreme și am făcut unele modificări la codul lui @bybloggers, cu diferența că în loc să folosesc template_redirect am schimbat cererea pentru a afișa o pagină statică, ceea ce înseamnă că acum poți adăuga orice dorești într-un șablon de pagină și să-l folosești pe acea pagină.

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) {
    //mergi la o pagină specifică când cheia usuario este setată
    $query_vars['page_id'] = isset($query_vars['usuario']) ? 7581 : $query_vars['page_id'];
    return $query_vars;
}
}
new ProfilePage();

Spaniolă -> usuario = utilizator <- Engleză

14 mar. 2013 02:33:56
Comentarii

Foarte frumos! Mulțumesc pentru împărtășire. Aș dori să o fac mai dinamică și poți înlocui ID-ul cu get_page_by_path('page-slug')->ID. De asemenea, nu uita să folosești flush_rewrite_rules, așa că aș adăuga ceva de genul: add_action( 'after_switch_theme', 'flush_rewrite_rules' );

Leo Caseiro Leo Caseiro
28 aug. 2016 10:12:33
0

Acesta este codul meu funcțional bazat pe răspunsul lui @bybloggers (mulțumesc, apropo).

Am învățat recent că nu ar trebui să folosim hook-ul template_redirect și apoi să ieșim din php, deoarece unele lucruri pot înceta să funcționeze din cauza întreruperii abrupte a execuției codului php.

Explicația este aici: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

Prin urmare, ar trebui să folosim hook-ul template_include. Cu acest hook, nu este nevoie să folosim metoda de redirecționare și ieșire.

Cealaltă diferență este că aveam nevoie doar de www.server.com/myaccount fără /userid.

Acesta este codul:

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

}
8 sept. 2015 10:57:15
0

O altă metodă este utilizarea BuddyPress, care are această funcționalitate integrată, chiar dacă pluginul oferă și alte caracteristici care s-ar putea să nu fie de interes.

http://wordpress.org/extend/plugins/buddypress/

17 iul. 2012 23:16:37