Переменная запроса WordPress
Оригинальное название: WordPress query variable
Коротко
Именованный параметр запроса, который WordPress понимает и превращает в условие выборки: номер записи, рубрика, страница пагинации, поисковая фраза или свой параметр плагина.
Что такое «Переменная запроса WordPress»
Любой адрес сайта WordPress в итоге сводится к набору пар «имя — значение». Адрес /category/news/page/2/ после разбора правил перезаписи превращается в category_name=news и paged=2, адрес /?s=доставка — в s=доставка. По этим переменным класс WP собирает основной запрос, а WP_Query выбирает записи и решает, какой шаблон показать.
Распознаются только переменные из белого списка: p, page_id, name, pagename, cat, tag, s, paged, post_type, author, year и ещё несколько десятков. Произвольный параметр из строки запроса WordPress просто проигнорирует, пока его не зарегистрировать.
Пример: своя переменная и красивый адрес
Нужно, чтобы адрес /uslugi/kazan/ открывал страницу услуг с фильтром по городу:
add_filter( 'query_vars', function ( $vars ) {
$vars[] = 'city';
return $vars;
} );
add_action( 'init', function () {
add_rewrite_rule( '^uslugi/([^/]+)/?$', 'index.php?pagename=uslugi&city=$matches[1]', 'top' );
} );
// в шаблоне страницы
$city = sanitize_title( get_query_var( 'city' ) );
После добавления правила нужно один раз пересохранить настройки постоянных ссылок, иначе WordPress о нём не узнает и вернёт 404. Значение из адреса приходит от посетителя, поэтому перед использованием его очищают.
Ловушка с зарезервированными именами
Публичные переменные действуют не только в адресе, но и в данных формы. Если назвать поле формы name, year, author или day, WordPress воспримет его как переменную запроса и вместо обработки формы покажет страницу 404 или чужой архив. Поля своих форм и параметры плагинов называют с префиксом — myform_name, shop_city. Тот же совет касается имён таксономий и типов записей: они тоже становятся переменными запроса.

