WordPress. Постоянные ссылки и преобразование URL

25.08.2019

Теги: APICMSSEOURLWeb-разработка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/
Обратите внимание, что каждый раз при добавлении нового правила переопределения URL-адресов, необходимо сгенерировать заново постоянные ссылки. Сделать это можно на странице настроек постоянных ссылок — просто зайдите туда и сохраните настройки, ничего не изменяя.

Дополнительно

Поиск: API • CMS • SEO • URL • Web-разработка • WordPress • Запрос • Переменная • ЧПУ

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.