Использование пользовательского/динамического "slug" для страницы
У меня есть пользовательская страница, которая использует шаблон под названием "Stores" http://example.com/stores/
. На этой странице будет список штатов и/или компаний в качестве категорий. Для этой системы у меня есть пользовательский тип записи "store", который может быть назначен одной категории (либо штату, либо компании).
Каждый магазин не является отдельной страницей, а представляет собой контактную информацию, которая отображается в виде телефонного справочника для штатов/компаний.
Проблема в том, как сделать так, чтобы мой шаблон "Stores" принимал URL-запросы вида http://example.com/stores/california/
(без выдачи ошибки 404)?
California
в данном случае не страница, а параметр запроса. Я также не хочу вручную создавать страницу для каждой из этих категорий (так как они извлекаются из базы данных автоматически). Я мог бы использовать ?state=california
для этой цели, но хотелось бы узнать правильный способ разрешить такой URL в WordPress.
Является ли правильным способом редактирование файла htaccess вручную? Не будет ли он перезаписан при изменении структуры постоянных ссылок? Как правильно форматировать htaccess?

Создание шаблона страницы
Добавьте новую страницу и задайте ей ярлык (slug) stores
Добавление публичной переменной запроса
add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars){
$vars[] = 'state'; // Добавляем переменную 'state' в массив query_vars
return $vars;
}
Добавление правила перезаписи URL
Это правило будет перенаправлять запросы на вашу страницу stores
.
add_rewrite_rule('^stores/([^/]*)/?','index.php?post_type=page&name=stores&state=$matches[1]','top');
В вашем шаблоне
Вы можете получить доступ к переменной state следующим образом:
$state = get_query_var('state'); // Получаем значение переменной state из URL
Сброс постоянных ссылок
Перейдите в Настройки→Постоянные ссылки, чтобы сбросить их и добавить ваше правило перезаписи в стек.

Извините за задержку. Этот код работает, но есть проблема с вики, которую я не могу идентифицировать. Теперь, когда я перехожу в stores/alabama, вместо страницы 404 корректно загружается страница Store. Однако, она перенаправляет меня обратно на /stores/, и нет никаких признаков переменной запроса "state" (даже сделал дамп $wp_query в шаблоне, ничего про alabama). Почему происходит перенаправление обратно на /state/? Я сбросил постоянные ссылки (поэтому URL все еще "работает").

Обновление: Если я убираю post_type=page&name=stores
, то попадаю на целевую страницу, однако переменная запроса "state" существует. Перенаправление удаляет query var, хотя я до сих пор не понимаю, почему указание типа записи вызывает перенаправление.

Решение с 'post_type=page&name=stores' у меня тоже не работает. Пришлось использовать подход из решения Jareds с ID страниц.

Я нашел ответ на сайте WordPress и проверил решение: https://codex.wordpress.org/Rewrite_API/add_rewrite_rule#Using_Custom_Templates_with_custom_querystring
Создание шаблона страницы
Создайте шаблон страницы для магазинов и примените его к странице.
$stores = get_query_var('stores');
Добавление rewrite-тега
В файле functions.php добавьте rewrite-тег, который укажет WordPress искать этот конкретный тег
function custom_rewrite_tag() {
add_rewrite_tag('%stores%', '([^&]+)');
}
add_action('init', 'custom_rewrite_tag', 10, 0);
Добавление rewrite-правила
Теперь для форматирования URL и перенаправления на index.php с переменными добавьте следующий код в functions.php. Примечание: Необходимо обновить page_id на ID страницы магазинов (в данном примере используется 12).
function custom_rewrite_rule() {
add_rewrite_rule('^stores/([^/]*)/?','index.php?page_id=12&stores=$matches[1]','top');
}
add_action('init', 'custom_rewrite_rule', 10, 0);
После этого вы можете перейти по адресу /stores/south-dakota/, и переменная $stores в вашем шаблоне страницы будет содержать значение "south-dakota".

Я также пытался сделать то же самое и в итоге добился этого следующим способом.
Добавьте следующий код в файл functions.php вашей темы.
add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars){
$vars[] = 'state';
return $vars;
}
add_rewrite_rule('^stores/([^/]+)/?$','index.php?pagename=stores&state=$matches[1]','top');
В вашем шаблоне получите переменную запроса с помощью этого кода
$state = get_query_var('state');

Вот рабочий пример для управления динамическим slug и назначения шаблона для него:
Управляйте своим пользовательским endpoint или slug динамически или задавайте его в файле
/** Устанавливаем правило перезаписи для пользовательской таблицы userlist-table */
$customendpoint = get_option('dynamic_slug_custom_endpoint');
add_action('init', 'setRewriteRule);
function setRewriterule() {
add_rewrite_rule($customendpoint . '/?', 'index.php?' . $customendpoint . '=parent-xml-page', 'top');
}
/** Добавляем конкретный параметр запроса в белый список * */
add_filter('query_vars', 'getQueryvar');
public function getQueryvar($query_vars) {
$query_vars[] = $customendpoint;
return $query_vars;
}
Подключаем ваш пользовательский шаблон для этого slug:
/** Проверяем параметр запроса и перенаправляем на файл шаблона * */
add_action('template_include', 'redirectTemplate');
function redirectTemplate($template) {
if (get_query_var($customendpoint == false || get_query_var($customendpoint == '') {
return $template;
}
return 'your-template.php';
}
