Odkryłem, że robię to na dwa sposoby:
- Strona autora z niestandardową regułą przepisywania
- 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.
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.
Hiszpański -> usuario = użytkownik <- angielski
źródło
get_page_by_path('page-slug')->ID
. Nie zapomnij również o użyciuflush_rewrite_rules
, więc dodam:add_action( 'after_switch_theme', 'flush_rewrite_rules' );
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:
źródło
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/
źródło