Вопрос или проблема
Я экспериментировал с переписываниями и query_var
, чтобы сгенерировать некоторые списки, например:
- ~/my-page/?my_var=1
- ~/my-page/?my_var=2
- ~/my-page/?my_var=3
После того как я просмотрел StackExchange и интернет, кажется, что преобладающее мнение таково, что add_rewrite_endpoint – это правильное решение. Таким образом, я реализовал следующее:
function wpd_add_my_endpoint(){
add_rewrite_endpoint( 'my_var', EP_PAGES );
}
add_action( 'init', 'wpd_add_my_endpoint' );
Это дает следующие URI на основе тех, которые я упоминал ранее:
- ~/my-page/my_var/1
- ~/my-page/my_var/2
- ~/my-page/my_var/3
Однако я бы хотел убрать ‘базу конечной точки’ (или слаг, даже не знаю, как это точно назвать, в данном вопросе/примере ‘my_var’), так чтобы URI выглядели так:
- ~/my-page/1/
- ~/my-page/2/
- ~/my-page/3/
Я попробовал множество различных способов сделать переписывания, но ни один не сработал, вот что у меня есть на данный момент, что не работает:
function setup_filter_rewrites(){
add_rewrite_rule('my-page/([^/]*)/?', 'index.php?pagename=my-page&my_var=$matches[1]', 'top');
}
add_action( 'init', 'setup_filter_rewrites' );
Обновлено
Мой код в полном объеме теперь выглядит так:
// Добавить Query Var
function add_query_vars_filter( $vars ){
$vars[] = "my_var";
return $vars;
}
add_filter( 'query_vars', 'add_query_vars_filter' );
// Добавить конечную точку
function wpd_add_my_endpoint(){
add_rewrite_endpoint( 'my_var', EP_PERMALINK | EP_PAGES );
}
add_action( 'init', 'wpd_add_my_endpoint' );
// Добавить переписывание
function setup_filter_rewrites(){
add_rewrite_rule('^my-page\/([0-9]+)\/?', 'index.php?pagename=my-page&my_var=$matches[1]', 'top');
}
add_action( 'init', 'setup_filter_rewrites' );
С приведенным выше кодом, ~/my-page/my_var/1/ работает, но ~/my-page/1/ возвращает 404. (Я сбросил постоянные ссылки)
Огромное спасибо заранее!
Я думаю, что add_rewrite_rule
– это правильный путь, и я думаю, что то, что у вас есть, тоже верно, за исключением Регулярки.
Попробуйте заменить то, что у вас сейчас, на это => ^my-page\/([0-9]+)\/?
.
Полный код ниже:
function setup_filter_rewrites(){
add_rewrite_rule('^my-page\/([0-9]+)\/?', 'index.php?pagename=my-page&my_var=$matches[1]', 'top');
}
add_action( 'init', 'setup_filter_rewrites' );
Хорошо, после некоторых правок и экспериментов, у меня есть следующий код, который, похоже, работает:
// Добавить Query Var
function add_query_vars_filter( $vars ){
$vars[] = "my_var";
return $vars;
}
add_filter( 'query_vars', 'add_query_vars_filter' );
// Добавить конечную точку
function wpd_add_my_endpoint(){
add_rewrite_endpoint( 'my_var', EP_PAGES );
}
add_action( 'init', 'wpd_add_my_endpoint' );
// Добавить правило переписывания
function myplugin_rewrite_rule() {
add_rewrite_rule( '^my-page/([^/]*)/?', 'index.php?pagename=my-page&my_var=$matches[1]','top' );
}
add_action('init', 'myplugin_rewrite_rule', 10, 0);
Ответ или решение
Как использовать конечную точку (endpoint) без базового адреса в WordPress
В WordPress есть возможность создания пользовательских конечных точек (endpoints) и переписывания адресов, что позволяет организовать структуру URL на вашем сайте более гибко. В вашем вопросе вы описали задачу, когда необходимо избавиться от базового адреса конечной точки (slug) и настроить URL в следующем формате:
/my-page/1/
/my-page/2/
/my-page/3/
Настройка переписывания URL
Ваша текущая реализация включает в себя определение пользовательской переменной запроса и создание переписывающих правил с использованием функции add_rewrite_rule()
. Ниже представлена полная последовательность действий для достижения желаемого результата.
1. Добавление переменной запроса
Сначала необходимо зарегистрировать переменную запроса, которая будет использоваться для передачи значения в вашем URL:
function add_query_vars_filter( $vars ){
$vars[] = "my_var";
return $vars;
}
add_filter( 'query_vars', 'add_query_vars_filter' );
2. Создание переписывающего правила
Далее, добавляем правило для переписывания, которое будет захватывать нужное значение из URL и передавать его в переменную my_var
:
function myplugin_rewrite_rule() {
add_rewrite_rule('^my-page/([0-9]+)/?$', 'index.php?pagename=my-page&my_var=$matches[1]', 'top');
}
add_action('init', 'myplugin_rewrite_rule', 10, 0);
3. Обновление структуры постоянных ссылок
После внесения выбросов в код, не забудьте обновить структуру постоянных ссылок. Это можно сделать через админ-панель WordPress, просто зайдя в Настройки > Постоянные ссылки
и нажав на кнопку "Сохранить изменения". Это действие сбросит кэш структуры URL и применит ваши новые правила.
4. Извлечение переменной запроса
Теперь, когда URL правильно настроен, вы можете извлекать переменную my_var
из глобального массива $wp_query
в файле шаблона my-page.php
:
$my_var = get_query_var('my_var');
if ($my_var) {
// Обработка значения my_var
echo 'Текущий my_var: ' . esc_html($my_var);
}
Заключение
Следуя описанным шагам, вы сможете избавиться от базового адреса конечной точки, используя только необходимое значение в URL. Это позволит вашим пользователям легко делиться и запоминать адреса страниц, что, в свою очередь, может положительно отразиться на SEO вашего сайта.
Если после выполнения всех шагов вы всё ещё сталкиваетесь с проблемами, убедитесь, что вы очищаете кеш и проверяете наличие конфликтов с другими переписывающими правилами или плагинами. Удачи в разработке!