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
Список публичных переменных запроса
attachment
attachment_id
author
author_name
cat
calendar
category_name
comments_popup
cpage
day
error
exact
feed
hour
m
minute
monthnum
more
name
order
orderby
p
page_id
page
paged
pagename
pb
post_type
posts
preview
robots
s
search
second
sentence
static
subpost
subpost_id
taxonomy
tag
tag_id
tb
term
w
withcomments
withoutcomments
year
Приватные переменные запроса
Приватные переменные запроса не передаются в строке URL-адреса. Они могут использоваться только в коде плагина или в файле functions.php
темы, чтобы изменить запрос к базе данных. Следующая строка не вернет ожидаемый результат:
http://www.example.com/?meta_key=city&meta_value=moscow
Так происходит потому, что meta_key
и meta_value
— приватные переменные, которые не предназначены для использования в адресной строке. Они должны быть переданы экземпляру класса WP_Query
, а как — рассмотрим чуть ниже.
Список приватных переменных запроса
category__in
category__not_in
category__and
comments_per_page
offset
perm
post__in
post__not_in
post_mime_type
post_parent__in
tag__and
tag__in
tag__not_in
tag_id
tag_slug__and
tag_slug__in
meta_key
meta_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 • Запрос • Переменная • ЧПУ