Come creare un profilo utente frontend con un permalink user-friendly
Voglio creare una pagina profilo pubblica frontend con un URL user-friendly in questo formato:
mysite.com/user/nomeutente
Qualche idea su come posso realizzarlo? So che ha a che fare con le rewrite rules ma non ho idea di come fare. Se avete qualche link o tutorial da suggerirmi sarebbe fantastico.
Grazie!

Ho scoperto due modi per farlo:
- Pagina Autore con una regola di riscrittura personalizzata
- File template personalizzati abbinati a una regola di riscrittura
Il primo è più semplice da implementare, ma potrebbe non funzionare in tutte le circostanze (una delle quali descriverò tra poco).
Regola di Riscrittura Personalizzata
Ho trovato questa soluzione alcuni giorni fa qui: URL Rewriting
Ed ecco il codice, con i commenti:
// Definisci i livelli di autore che vuoi utilizzare
$custom_author_levels = array( 'user', 'leader' );
// All'inizializzazione, aggiungi un nuovo rewrite tag per author_level e aggiungilo alla proprietà author_base di wp_rewrite
add_action( 'init', 'wpleet_init' );
function wpleet_init()
{
global $wp_rewrite;
$author_levels = $GLOBALS['custom_author_levels'];
// Definisci il tag e usalo nella regola di riscrittura
add_rewrite_tag( '%author_level%', '(' . implode( '|', $author_levels ) . ')' );
$wp_rewrite->author_base = '%author_level%';
}
// La funzione precedente crea regole di riscrittura extra per author_name che non sono necessarie.
// Questa funzione le rileva e rimuove
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;
}
Puoi quindi usare il template author.php integrato, modificandolo a tuo piacimento.
Sinceramente, controlla il link sopra elencato, poiché Jan Fabry fa un ottimo lavoro nel spiegare tutto.
Query Vars e Template di Pagina
Per il tema su cui stavo lavorando mentre scoprivo queste soluzioni, avevo bisogno di servire una pagina personalizzata basata su un valore meta dell'utente (un ID separato). Il mio cliente non voleva che lo username o l'ID utente fossero visibili pubblicamente, quindi abbiamo creato un livello separato.
L'unico problema? Al momento, non c'è un modo chiaro per usare l'API di Rewrite per interrogare tramite meta key/valori. Fortunatamente, c'era una soluzione.
Nel tuo file functions.php...
// Crea il query var così che WP catturi il tuo URL personalizzato /user/username
add_filter( 'query_vars', 'wpleet_rewrite_add_var' );
function wpleet_rewrite_add_var( $vars )
{
$vars[] = 'user';
return $vars;
}
E poi, devi creare un nuovo rewrite tag e una regola così che sappia quando e come gestire il nuovo query var.
add_rewrite_tag( '%user%', '([^&]+)' );
add_rewrite_rule(
'^user/([^/]*)/?',
'index.php?user=$matches[1]',
'top'
);
Una volta fatto questo, devi solo "catturare" quando il query var viene servito, e poi reindirizzare al template di tua scelta:
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;
}
}
Assicurati solo di aver creato user-profile.php.
Nel mio esempio, ho creato una terza funzione che abbinava l'"ID Utente pubblico" all'user_id effettivo tramite la tabella $wpdb->usermeta, e passava le informazioni al template.
Se hai bisogno di creare un template diverso dal resto del tuo tema, ricorda che con get_header puoi specificare un nome:
get_header( 'user' );
Che chiamerà il file header-user.php.
Conclusione
Entrambe queste soluzioni sono valide e funzionanti. La seconda offre un livello separato di "sicurezza" poiché non rivela gli ID utente o gli username, se altre persone potranno navigare i profili.
Spero che sia d'aiuto, fammi sapere se hai domande.

@bybloggers So che questo post è un po' vecchio, ma ero curioso di sapere se potresti condividere la tua terza funzione per passare il nome utente nell'URL al template?

@Pat Non sono sicuro di dove sia esattamente la funzione nel mio codice in questo momento (come hai detto, è passato un po' di tempo), ma il formato sarebbe molto simile alla funzione wpleet_rewrite_catch(). Invece di array_key_exists( 'user' ), stavo verificando l'ID pubblico dell'utente, e poi facevo una ricerca nella tabella wp_usermeta per vedere quale utente aveva associato quell'ID pubblico. Spero che l'algoritmo sia utile, anche se il codice non è disponibile.

Ho trovato questo codice oggi e ho apportato alcune modifiche al codice di @bybloggers con la differenza che invece di usare template_redirect ho modificato la richiesta per mostrare una pagina statica, ciò significa che ora puoi aggiungere qualsiasi elemento desideri a un template di pagina e utilizzarlo su quella 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) {
//vai a una pagina specifica quando la chiave 'usuario' è impostata
$query_vars['page_id'] = isset($query_vars['usuario']) ? 7581 : $query_vars['page_id'];
return $query_vars;
}
}
new ProfilePage();
Spagnolo -> usuario = utente <- Italiano

Molto bello! Grazie per averlo condiviso. Vorrei renderlo più dinamico e puoi cambiare l'id con get_page_by_path('page-slug')->ID
. Inoltre non dimenticare di usare flush_rewrite_rules
, quindi aggiungerei qualcosa come: add_action( 'after_switch_theme', 'flush_rewrite_rules' );

Questo è il mio codice funzionante basato sulla risposta di @bybloggers (grazie comunque) Ho appena imparato che non dovremmo usare l'hook template_redirect e poi uscire da PHP, perché alcune cose potrebbero smettere di funzionare a causa dell'interruzione brusca dell'esecuzione del codice PHP.
La spiegazione è qui: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/
Quindi, dovremmo usare l'hook template_include. Con questo hook, non c'è bisogno di usare il metodo di reindirizzamento e uscita.
L'altra differenza è che avevo bisogno solo di www.server.com/myaccount senza il /userid.
Questo è il codice:
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;
}
}

Un altro modo è utilizzare BuddyPress che ha questa funzionalità integrata, anche se il plugin offre molte più funzionalità che potrebbero non essere di interesse.
