Jak utworzyć profil użytkownika front-end z przyjaznym permalinkiem

23

Chcę utworzyć publiczną stronę profilu frontonu z przyjaznym adresem URL takim jak ten.

mysite.com/user/someusername

Masz pomysł, jak to osiągnąć? Wiem, że ma to coś wspólnego z regułą przepisywania, ale nie mam pojęcia, jak to zrobić. Jeśli masz dla mnie link lub samouczek, będzie świetnie.

Dzięki!

pochylić w dół
źródło

Odpowiedzi:

15

Odkryłem, że robię to na dwa sposoby:

  1. Strona autora z niestandardową regułą przepisywania
  2. Niestandardowe pliki szablonów sparowane z regułą przepisywania

Pierwszy jest prostszy do wdrożenia, ale może nie działać we wszystkich okolicznościach (o jednym z nich opiszę wkrótce).

Niestandardowa reguła przepisywania

Kilka dni temu znalazłem to rozwiązanie: przepisywanie adresów URL

A oto kod z komentarzami:

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

Następnie możesz użyć wbudowanego szablonu autor.php, modyfikując zawartość swoich serc.

Z poważaniem sprawdź link wymieniony powyżej, ponieważ Jan Fabry wykonuje doskonałą robotę, tłumacząc wszystko.

Zmienne zapytań i szablony stron

W przypadku motywu, nad którym pracowałem, odkrywając te rozwiązania, musiałem wyświetlić niestandardową stronę opartą na meta wartości użytkownika (osobny identyfikator). Mój klient nie chciał, aby nazwa użytkownika lub identyfikator użytkownika były widoczne publicznie, dlatego utworzyliśmy osobną warstwę.

Jedyny problem? W tej chwili nie ma jasnego sposobu użycia interfejsu API Rewrite do zapytania według meta kluczy / wartości. Na szczęście było rozwiązanie.

W twoim pliku 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;
}

Następnie musisz utworzyć nowy tag i regułę przepisywania, aby wiedział, kiedy i jak obsłużyć nowe zapytanie var.

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

Po wykonaniu tej czynności wystarczy „złapać”, gdy jest obsługiwane zapytanie var, a następnie przekierować do wybranego szablonu:

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

Upewnij się tylko, że utworzyłeś user-profile.php.

W moim przykładzie utworzyłem trzecią funkcję, która dopasowała „publiczny identyfikator użytkownika” do faktycznego ID_użytkownika za pomocą tabeli $ wpdb-> usermeta i przekazałem informacje do szablonu.

Jeśli musisz utworzyć szablon inny niż reszta motywu, pamiętaj, że za pomocą get_header możesz podać nazwę:

get_header( 'user' );

Który wywoła plik header-user.php.

Wniosek

Oba są poprawnymi, działającymi rozwiązaniami. Drugi oferuje osobną warstwę „bezpieczeństwa”, ponieważ nie ujawnia identyfikatorów ani nazw użytkowników, jeśli inne osoby będą mogły przeglądać profile.

Mam nadzieję, że to pomoże, daj mi znać, jeśli masz jakieś pytania.

blogerzy
źródło
Rozwiązałem go za pomocą metody Query_var. Dzięki!
tiltdown
1
@bybloggers Wiem, że ten post jest trochę stary, ale zastanawiałem się, czy możesz udostępnić swoją trzecią funkcję przekazywania nazwy użytkownika w adresie URL do szablonu?
Pat
@Pat Nie jestem pewien, gdzie aktualnie jest cała funkcja w moim kodzie (jak powiedziałeś, było to jakiś czas temu), ale format bardzo ściśle podążałby za funkcją wpleet_rewrite_catch (). Zamiast array_key_exists („użytkownik”) testowałem publiczny identyfikator użytkownika, a następnie przeszukiwałem tabelę wp_usermeta, aby zobaczyć, który użytkownik ma z nim powiązany identyfikator publiczny. Mam nadzieję, że algorytm pomaga, nawet jeśli kod nie jest dostępny.
blogger
2

Znalazłem to wcześniej i wprowadziłem pewne modyfikacje do kodu @byblogger, z tą różnicą, że zamiast używać template_redirect zmieniam żądanie, aby wyświetlić stronę statyczną, co oznacza, że ​​możesz teraz dodać wszystko, co chcesz, do szablonu strony i użyć go na tym strona.

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();

Hiszpański -> usuario = użytkownik <- angielski

Poxtron
źródło
Bardzo dobrze! Dzięki za udostępnienie tego. Chciałbym, aby był bardziej dynamiczny i możesz zmienić identyfikator za pomocą get_page_by_path('page-slug')->ID. Nie zapomnij również o użyciu flush_rewrite_rules, więc dodam:add_action( 'after_switch_theme', 'flush_rewrite_rules' );
Leo Caseiro
1

To jest mój działający kod oparty na odpowiedzi @bybloggerów (przy okazji). Po prostu dowiaduję się, że nie powinniśmy używać hooka template_redirect, a następnie wychodzić z php, ponieważ niektóre rzeczy mogą przestać działać z powodu nagłego przerwania wykonywania kodu przez php.

Wyjaśnienie znajduje się tutaj: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

Powinniśmy używać haka template_include. Dzięki temu haczykowi nie ma potrzeby używania metody przekierowania i wyjścia.

Inną różnicą jest to, że potrzebowałem www.server.com/myaccount bez identyfikatora / userid.

To jest kod:

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

}
Carlos B.
źródło
0

Innym sposobem jest użycie Buddypress, które mają tę wbudowaną funkcję, nawet jeśli wtyczka ma jeszcze więcej funkcji, które mogą nie być interesujące.

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

Jens Wedin
źródło