Прежде всего, вам нужна функция (тег шаблона) для отображения URL-адреса. Вы можете написать собственную функцию, которая выводит URL-адрес в нужном вам формате, однако размещение имени пользователя в общедоступном URL-адресе может стать проблемой безопасности.
Функция может обрабатывать ссылку и принимать аргумент.
example.com/user/username/favorites
that can be a user id or a user object. If non is passed, the function will try to use current post author (if in the loop).
example.com/my-favorites
Теперь вам нужно заставить WordPress понимать URL-адреса такого типа. Для этой цели вам необходимо использовать правило перезаписи.
В ОП вы сказали, что не используете переменные запросов, но вам следует это сделать. Проблема в том, что если вы хотите использовать красивую постоянную ссылку, вам придется использовать правило перезаписи, и любой параметр, добавленный с помощью правила перезаписи, доступен только через переменную запроса, а не через //favorites.php
$user_required = user_favorites_get_user();
$user = FALSE;
if ( ! empty($user_required ) ) {
$user = get_user_by( 'login', $user_required );
} elseif ( is_user_logged_in() ) {
$user = wp_get_current_user();
}
if ( $user instanceof WP_User && $user->exists() ) {
echo do_shortcode( '[favorite-post user_id = "' . $user->ID . '"]' );
} else {
echo 'No user selected.';
}
.
Так:
'favorites.php'
После добавления этого кода зайдите в свой бэкэнд и посетите страницу "Настройки -> Постоянные ссылки", чтобы сбросить правила перезаписи.
Теперь у вас есть формат URL-адреса, и когда вы посещаете этот URL-адрес, WordPress установит переменную запроса «Избранное», заполнив ее необходимым именем пользователя.
Однако мы не будем загружать страницу «Избранное» WordPress при вызове этого URL-адреса.
Я предлагаю вам создать собственный шаблон страницы и назначить ему страницу «Мое избранное».
Итак, создайте новый файл php, назовите его user_favorites_template
, and inside it write only this:
user_favorites_get_user
Ничего больше.
Теперь в бэкэнде создайте страницу (если у вас ее еще нет) и назначьте ей только что созданный шаблон.
После этого мы можем использовать pre_get_posts для запроса этой страницы, когда используется URL-адрес избранного пользователя.
'page-favorites.php'
С помощью этого кода мы сообщаем WordPress вызвать первую страницу с шаблоном. function user_favorites_noquery( $query ) {
if ( is_admin() || ! $query->is_main_query() || ! $query->is_home() ) return;
$user = $query->get('favorites');
if ( ! empty($user) ) {
$mq = array(
'meta_key' => '_wp_page_template', 'meta_value' => 'page-favorites.php'
);
$query->set( 'post_type', 'page' );
$query->set( 'meta_query', array($mq) );
$query->set( 'posts_per_page', 1);
$query->query['favorites'] = NULL;
$query->query_vars['favorites'] = NULL;
user_favorites_get_user( $user );
add_filter( 'template_include', 'user_favorites_template', 9999 );
// following line is to prevent WordPress redirect to the page standard url
remove_filter('template_redirect', 'redirect_canonical');
}
}
add_action( 'pre_get_posts', 'user_favorites_noquery' );
function user_favorites_get_user( $user = NULL ) {
static $the_user = NULL;
if ( ! empty($user) ) $the_user = $user;
return $the_user;
}
function user_favorites_template() {
return get_template_directory() . '/favorites.php';
}
when the favorites url is required.
Функция <?php
/*
Template Name: My Favorites
*/
require( 'favorites.php' );
is an helper function we use to save the required user, avoiding the use of global variables.
Функция 'page-favorites.php'
force WordPress to load 'favorites.php' as template.
Внутри function user_favorites_rule() {
add_rewrite_rule( 'user/([^/]+)/favorites', 'index.php?favorites=$matches[1]', 'top' );
}
add_action( 'init', 'user_favorites_rule', 1 );
function user_favorites_var( $vars ) {
$vars[] = 'favorites';
return $vars;
}
add_filter( 'query_vars', 'user_favorites_var' );
the relevant part is to output the shorcode for user favorites posts.
Есть 2 возможности: пользователь вошел в систему и хочет видеть свои избранные публикации, или кто-то (вошедший в систему или нет) хочет видеть публикации, добавленные пользователем в избранное.
Это может быть переведено в таком коде:
$_GET
Теперь, когда пользователь вошел в систему, он/она может посетить URL-адрес. function get_user_favorites_url( $user = NULL ) {
if ( is_int($user) ) $user = new WP_User( $user );
if ( ! $user instanceof WP_User ) $user = get_the_author();
if ( $user instanceof WP_User && $user->exists() ) {
return home_url( 'user/' . $user->user_login . '/favorites' );
}
}
(if 'my-favorites' is the slug of the page assigned to "My Favorites" page template) to see his/her own posts.
Любой вошедший или незарегистрированный посетитель может использовать URL-адрес типа $user
and vieving the favorites post for that specific user.