Come creare un profilo utente front-end con un permalink amichevole


23

Voglio creare una pagina di profilo front-end pubblica con un URL amichevole come questo formato.

mysite.com/user/someusername

Qualche idea su come posso raggiungere questo obiettivo? So che ha qualcosa a che fare con la regola di riscrittura, ma non ho idea di come posso farlo. Se hai qualche link o tutorial per me sarà fantastico.

Grazie!

Risposte:


15

Ci sono due modi che ho scoperto facendo questo:

  1. Pagina dell'autore con una regola di riscrittura personalizzata
  2. File di modello personalizzati associati a una regola di riscrittura

Il primo è più semplice da implementare, ma potrebbe non funzionare in tutte le circostanze (una delle quali descriverò presto).

Regola di riscrittura personalizzata

Ho trovato questa soluzione alcuni giorni fa qui: URL Rewriting

Ed ecco il codice, con commenti:

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

È quindi possibile utilizzare il modello incorporato author.php, modificando il contenuto del tuo cuore.

Cordiali saluti, controlla il link sopra elencato, poiché Jan Fabry fa un ottimo lavoro spiegando tutto.

Query Vars e modelli di pagina

Per il tema su cui stavo lavorando durante la scoperta di queste soluzioni, dovevo servire una pagina personalizzata basata su un meta valore dell'utente (un ID separato). Il mio cliente non voleva che il nome utente o l'ID utente fossero visibili pubblicamente, quindi abbiamo creato un livello separato.

L'unico problema? Al momento, non esiste un modo chiaro per utilizzare l'API di riscrittura per eseguire query in base a meta chiavi / valori. Fortunatamente, c'era una soluzione.

Nel tuo file 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;
}

Quindi, è necessario creare un nuovo tag e regola di riscrittura in modo che sappia quando e come gestire la nuova query var.

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

Una volta fatto questo, devi semplicemente "catturare" quando viene servita la query var, e quindi reindirizzare al modello che preferisci:

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 corrispondeva all '"ID utente pubblico" all'attuale user_id tramite la tabella $ wpdb-> usermeta e ho passato le informazioni al modello.

Se devi creare un modello 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 sono valide soluzioni funzionanti. Il secondo offre un livello separato di "sicurezza" in quanto non rivela ID utente o nomi utente, se altre persone saranno in grado di sfogliare i profili.

Spero che ti aiuti, fammi sapere se hai qualche domanda.


In realtà l'ho risolto usando il metodo Query_var. Grazie!
inclinazione

1
@bybloggers So che questo post è un po 'vecchio, ma era curioso di poter condividere la tua terza funzione per passare il nome utente nell'URL al modello?
Pat

@Pat Non sono sicuro di dove sia attualmente la funzione effettiva in tutto il mio codice (come hai detto, è stato un po 'di tempo fa), ma il formato seguirà da vicino la funzione wpleet_rewrite_catch (). Invece di array_key_exists ('utente'), stavo testando l'ID utente pubblico e quindi facendo una ricerca nella tabella wp_usermeta per vedere a quale utente era associato quell'ID pubblico. Spero che l'algoritmo aiuti, anche se il codice non è disponibile.
byblogger,

2

L'ho trovato prima oggi e ho apportato alcune modifiche al codice @bybloggers con la differenza che invece di utilizzare template_redirect cambio la richiesta per mostrare una pagina statica, ciò significa che ora puoi aggiungere tutto ciò che ti piace a un modello di pagina e usarlo su quello 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();

Spagnolo -> usuario = user <- Inglese


Molto bella! Grazie per averlo condiviso. Mi piacerebbe rendere più dinamico e puoi cambiare l'id con get_page_by_path('page-slug')->ID. Inoltre, non dimenticare l'uso flush_rewrite_rules, quindi aggiungerei come:add_action( 'after_switch_theme', 'flush_rewrite_rules' );
Leo Caseiro,

1

Questo è il mio codice di lavoro basato sulla risposta di @bybloggers (grazie a proposito) Ho appena imparato che non dovremmo usare l'hook template_redirect e quindi uscire da php, perché alcune cose potrebbero smettere di funzionare a causa della brusca interruzione del codice di esecuzione di 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 è necessario utilizzare il metodo di reindirizzamento e di uscita.

E l'altra differenza è che avevo solo bisogno di www.server.com/myaccount senza / 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;
    }

}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.