Использование пользовательского/динамического "slug" для страницы

23 авг. 2012 г., 22:25:29
Просмотры: 32.3K
Голосов: 10

У меня есть пользовательская страница, которая использует шаблон под названием "Stores" http://example.com/stores/. На этой странице будет список штатов и/или компаний в качестве категорий. Для этой системы у меня есть пользовательский тип записи "store", который может быть назначен одной категории (либо штату, либо компании).

Каждый магазин не является отдельной страницей, а представляет собой контактную информацию, которая отображается в виде телефонного справочника для штатов/компаний.

Проблема в том, как сделать так, чтобы мой шаблон "Stores" принимал URL-запросы вида http://example.com/stores/california/ (без выдачи ошибки 404)?

California в данном случае не страница, а параметр запроса. Я также не хочу вручную создавать страницу для каждой из этих категорий (так как они извлекаются из базы данных автоматически). Я мог бы использовать ?state=california для этой цели, но хотелось бы узнать правильный способ разрешить такой URL в WordPress.

Является ли правильным способом редактирование файла htaccess вручную? Не будет ли он перезаписан при изменении структуры постоянных ссылок? Как правильно форматировать htaccess?

0
Все ответы на вопрос 4
4
17

Создание шаблона страницы

Добавьте новую страницу и задайте ей ярлык (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

Сброс постоянных ссылок

Перейдите в Настройки→Постоянные ссылки, чтобы сбросить их и добавить ваше правило перезаписи в стек.

23 авг. 2012 г. 23:09:13
Комментарии

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

Radley Sustaire Radley Sustaire
3 сент. 2012 г. 12:22:20

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

Radley Sustaire Radley Sustaire
3 сент. 2012 г. 12:42:28

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

Kevin Kevin
7 июн. 2017 г. 12:36:09

Если мы изменим постоянные ссылки, не повлияет ли это на все URL, включая другие пользовательские типы записей и страницы, у которых может не быть этого конкретного поля?

Dinesh Patil Dinesh Patil
6 мая 2019 г. 12:47:53
0

Я нашел ответ на сайте 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".

17 апр. 2015 г. 23:33:52
0

Я также пытался сделать то же самое и в итоге добился этого следующим способом.

Добавьте следующий код в файл 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');
3 нояб. 2013 г. 10:04:34
0

Вот рабочий пример для управления динамическим 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';
}
11 нояб. 2021 г. 13:26:42