WordPress. Постоянные ссылки и преобразование URL
25.08.2019
Теги: API • CMS • SEO • URL • Web-разработка • WordPress • Запрос • Переменная • ЧПУ
У WordPress есть отдельный класс WP_Query, который умеет строить запросы к БД, выполнять их и сохранять результаты. Этот класс обрабатывает поступающие URL-запросы, строит на их основе SQL-запросы к базе данных и выполняет их. Из коробки WordPress понимает URL-запросы на отдельные посты, страницы, а также на несколько архивов: записи рубрики, записи с меткой, записи автора и т.д.
Разработчик может создать свой экземпляр класса WP_Query и передать ему нужный набор параметров: какие записи получать, в каком количестве, как их сортировать и т.п. Но можно передать свои параметры уже существующему экземпляру — и тем самым изменить основной запрос, который WordPress создает автоматически.
Параметры запроса называются переменными запроса и делятся на три группы.
Публичные переменные запроса
Эти переменные называются публичными, потому что доступны для использования в URL. Благодаря этим переменным мы можем запросить:
- записи определенного автора:
http://www.example.com/?author=6 http://www.example.com/?author_name=evgeniy
- записи определенной рубрики:
http://www.example.com/?cat=7,9,11 http://www.example.com/?category_name=web
- записи с какой-то меткой:
http://www.example.com/?tag=php
- записи за определенный месяц или год:
http://www.example.com/?monthnum=7 http://www.example.com/?year=2018
Список публичных переменных запроса
attachmentattachment_idauthorauthor_namecatcalendarcategory_namecomments_popupcpagedayerrorexactfeedhourmminutemonthnummorenameorderorderbyppage_idpagepagedpagenamepbpost_typepostspreviewrobotsssearchsecondsentencestaticsubpostsubpost_idtaxonomytagtag_idtbtermwwithcommentswithoutcommentsyear
Приватные переменные запроса
Приватные переменные запроса не передаются в строке URL-адреса. Они могут использоваться только в коде плагина или в файле functions.php темы, чтобы изменить запрос к базе данных. Следующая строка не вернет ожидаемый результат:
http://www.example.com/?meta_key=city&meta_value=moscow
Так происходит потому, что meta_key и meta_value — приватные переменные, которые не предназначены для использования в адресной строке. Они должны быть переданы экземпляру класса WP_Query, а как — рассмотрим чуть ниже.
Список приватных переменных запроса
category__incategory__not_incategory__andcomments_per_pageoffsetpermpost__inpost__not_inpost_mime_typepost_parent__intag__andtag__intag__not_intag_idtag_slug__andtag_slug__inmeta_keymeta_value
Пользовательские переменные запроса
Эти определенные пользователем переменные могут быть переданы через строку URL-запроса так же, как и публичные переменные запроса. Главная разница между пользовательскими и публичными переменными запроса в том, что WordPress не будет обрабатывать пользовательские переменные. Для этого мы должны получать их значения и настраивать запросы к базе данных сами — в коде плагина или в файле functions.php темы.
Безобразные постоянные ссылки (ugly permalinks)
Безобразные постоянные ссылки отображают строку запроса, где URL-адрес содержит набор переменных запроса, которые определяют возвращаемый ресурс. Например:
http://www.example.com/?cat=2 http://www.example.com/?author_name=evgeniy&category_name=web
Красивые постоянные ссылки (pretty permalinks)
Начиная использовать красивые постоянные ссылки, мы создаем удобную и оптимизированную для SEO структуру URL-адресов. Давайте сравним следующие URL:
http://www.example.com/?p=12345 http://example.com/some-post-slug/
На первой строке ugly permalink содержит переменную p и ее значение (идентификатор записи). В то время, как у pretty permalink в URL-адресе используется специальная фраза — slug записи.
WordPress предлагает для создания красивых постоянных ссылок 4 формата URL-адреса, которые мы можем выбрать в настройках постоянных ссылок, как это показано на скриншоте ниже.
Но мы не ограничены стандартными постоянными ссылками, ведь WordPress позволяет настраивать pretty permalinks с помощью использования одного или более структурных тегов.
Эти теги — специальные ключевые слова, окруженные символами %. WordPress предлагает следующие теги:
%year%— год публикации записи (4 цифры)%monthnum%— месяц публикации записи (2 цифры)%day%— день публикации записи (2 цифры)%hour%— час публикации записи (2 цифры)%minute%— минута публикации записи (2 цифры)%second%— секунда публикации записи (2 цифры)%post_id%— уникальный идентификатор записи (число)%postname%— slug записи%category%— slug категории%author%— slug автора
Поставим в настройках постоянных ссылок переключатель в положение «Произвольно» и добавим одну из следующих строк в поле ввода:
/%author%/%postname%/ /%year%/%postname%/ /%category%/%postname%/
Каждая из этих строк генерирует разные постоянные ссылки:
http://www.example.com/evgeniy/some-slug/ http://www.example.com/2018/some-slug/ http://www.example.com/web/some-slug/
В первом примере внутри URL-адреса содержится имя автора постов. В двух следующих строках указывается год публикации и рубрика поста соответственно.
Собственные переменные запроса
В дополнение к публичным и приватным переменным запроса WordPress позволяет разработчикам определять их собственные переменные запроса. После того, как эти переменные будут зарегистрированы, они могут быть использованы в строке URL так же, как и публичные переменные запроса. Впоследствии значения переменных могут быть использованы, чтобы влиять на запросы к БД.
Давайте создадим плагин и добавим в него следующий код:
/* * Добавляем к публичным переменным запроса еще одну */ add_filter('query_vars', function ($vars) { $vars[] = 'city'; return $vars; }); /* * Изменяем основной запрос к базе данных */ add_action('pre_get_posts', function ($query) { if (is_admin() || !$query->is_main_query()) { return; } $city = get_query_var('city'); if(!empty($city)) { $query->set('meta_key', 'city'); $query->set('meta_value', $city); $query->set('meta_compare', 'LIKE'); } });
Фильтр query_vars позволяет добавлять, удалять или изменять публичные переменные запроса перед его выполнением. Функция обратного вызова в качестве аргумента принимает массив доступных переменных, добавляет новую переменную и возвращает этот же массив.
Событие pre_get_posts срабатывает перед выполнением запроса к БД на выборку записей. Поэтому мы можем «прицепить» к этому хуку нашу функцию, чтобы изменить условия выборки.
Активируем плагин и добавим к нескольким записям блога произвольное поле city со значением moscow. Теперь мы можем получить эти записи, набрав в адресной строке браузера
http://www.example.com/?city=moscow
Добавляем красивые ссылки
Давайте теперь преобразуем ugly permalinks из предыдущего примера в pretty permalinks. Для этого добавим в код плагина еще несколько строк:
/* * Преобразуем ugly permalinks в pretty permalinks */ add_action('init', function () { add_rewrite_tag('%city%', '([^&]+)'); add_rewrite_rule( '^city/([^/]*)/?', 'index.php?city=$matches[1]', 'top' ); });
Функции add_rewrite_tag() и add_rewrite_rule() являются частью Rewrite API. Функция add_rewrite_tag() позволяет WordPress узнать о новой переменной запроса city, в том время как add_rewrite_rule() создает новое правило преобразования URL. Теперь мы можем набрать в адресной строке браузера следующий запрос:
http://www.example.com/city/moscow/
Дополнительно
- WordPress. Плагин «Транслитерация URL»
- Битрикс. Система обработки адресов
- WordPress. Фильтр записей по произвольным полям. Часть 3 из 3
- WordPress. Фильтр записей по произвольным полям. Часть 2 из 3
- WordPress. Добавляем мета-теги. Часть 3 из 3
- WordPress. Добавляем мета-теги. Часть 2 из 3
- WordPress. Порядок загрузки страницы
Поиск: API • CMS • SEO • URL • Web-разработка • WordPress • Запрос • Переменная • ЧПУ
