В сегодняшнем посте мы разберем подробно постоянные ссылки WordPress и переопределение URL. В 1999 году Якоб Нильсен опубликовал пост “URL как пользовательский интерфейс”. Там он указал список признаков удобного сайта:

  • Доменное имя, которое легко запомнить и проговорить;
  • Короткие URL’ы;
  • Легко набираемые URL’ы;
  • URL’ы, которые визуализируют структуру сайта;
  • URL’ы, которые можно “взламывать”, чтобы позволить пользователям добираться до верхних уровней информационной структуры, просто изменив конец URL;
  • Постоянные URL’ы, которые не изменяются.

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

В статичном вебе URL указывает на ресурс по его имени, как это показано в примере ниже:

http://example.com/path/to/resource/some-resource.html

Чтобы иметь хорошо структурированные URL’ы, нам нужна просто хорошо структурированная файловая система и правильно названные ресурсы (файлы).

Но современный веб динамичен, и мы используем CMS для управления сайтами. URL’ы содержат параметры, которые определяют запросы для взаимодействия с базой данных. Рассмотрим следующий пример:

http://example.com/?param1=value1&param2=value2

В этом URL-адресе вы увидите разделитель (знак вопроса) и набор пар ключ / значение, разделенных амперсандом. URL в примере не соответствует требованиям по удобству использования и доступности. Поэтому это отличный кандидат для преобразования в постоянную ссылку, которая будет более значима в SEO.

То, как некрасивые URL’ы преобразуются в постоянные ссылки, зависит от веб-сервера, которые вы используете. Если вы являетесь пользователем веб-сервера Apache, то вам нужно разместить в корневой директории проекта файл .htaccess с набором директив rewrite. Если вы используете Nginx, тогда добавьте директивы try_files в главный конфигурационный файл сервера.

Не волнуйтесь. Построчно конфигурировать веб-сервер вам не потребуется в большинстве случаев. Самые популярные CMS позволяют пользователям управлять структурой постоянных ссылок просто и безопасно в панели администратора CMS. И WordPress не исключение. Администраторы могут быстро и легко устанавливать свои собственные правила переопределения (rewrite rules) URL в консоли WordPress. Продвинутые пользователи и разработчики могут получить еще больше благодаря Rewrite API. Он предоставляет специальные функции и хуки, которые позволяют настраивать постоянные ссылки более тонко.

Настройка постоянных ссылок

Настройка постоянных ссылок

URL-адреса определяют, какие запросы будут направляться к базе данных. По этой причине первым шагом будет короткое введение в запросы WordPress.

Обзор запросов WordPress

У WordPress есть отдельный класс WP_Query, который помогает строить запросы к базе данных, выполнять их и сохранить результаты. Благодаря этому классу нам не нужно заботиться о запросах к БД. WP_Query автоматически обработает URL-запрос, построит запрос к БД и выполнит его. Затем, согласно иерархии шаблонов, WordPress вернет результат запроса.

Из коробки WordPress принимает запросы на отдельные посты, страницы, типы постов, а также на несколько архивов, упорядоченных по категориям, тегам, дате, авторам и т.д. Более того, если функциональности по умолчанию недостаточно, разработчики могут строить собственные запросы с помощью создания новых экземпляров класса WP_Query или передавать специальные параметры существующему экземпляру перед выполнением запроса.

Параметры запроса называются переменными запроса и делятся на три группы.

Публичные переменные запроса

Эти переменные называются публичными в том смысле, что они доступны для использования в публичных запросах (например, в URL). Благодаря этим переменным мы можем запросить посты определенного автора:

?author=6
?author_name=vasya

По категории или тегу:

?cat=7,8,9,10
?category_name=Web
?tag=php

По дате и времени:

?monthnum=201203
?year=2011
?w=12
?day=13

По посту или странице:

?p=777
?name=gulp
?page_id=777

И много по чему еще.

Приватные переменные запроса

Приватные переменные запроса не передаются в строке URL-адреса. Они могут использоваться только внутри скрипта (плагин или файл темы functions.php), чтобы влиять на запрос к базе данных.

Следующая строка не вернет ожидаемый результат:

?meta_key=city&meta_value=petersburg

Так происходит потому, что meta_key и meta_value – приватные переменные, которые не предназначены для использования в адресной строке. Они должны быть переданы экземпляру класса WP_Query, как я покажу вам далее.

Смотрите полный список публичных и приватных переменных запроса в Кодексе.

Пользовательские переменные запроса

Эти определенные пользователем переменные могут быть переданы через строку URL-запроса так же, как и публичные переменные запроса. Главная разница между пользовательскими и публичными переменными запроса в том, что WordPress не будет обрабатывать пользовательские переменные. Для этого мы должны получать их значения и настраивать запросы к базе данных сами из скрипта.

Окей, вернемся к постоянным ссылкам.

Безобразные постоянные ссылки (ugly permalinks) WordPress и переменные запроса

Безобразные постоянные ссылки отображают строку запроса, где Часть URL-адреса содержит набор переменных запроса, которые определяют возвращаемый ресурс.

Настройки постоянных ссылок

По умолчанию WordPress использует безобразные постоянные ссылки

Для примера рассмотрим следующие URL’ы:

http://example.com/?cat=2
http://example.com/?cat=6,8,11

В ответ на эти URL-запросы WordPress вернет архив сообщений, принадлежащих указанным категориям.
Мы не ограничены количеством параметров запроса для каждого URL-адреса. В следующих примерах покажем более сложные запросы:

?author_name=oleg&category_name=Web
?tag=html&m=199303

В первой строке author_name и category_name будут запрашиваться все посты автора oleg в категории Web. В ответе на запрос из второй строки будут получены все посты, отмеченные тегом html и опубликованные в марте 1993.
Как вы можете заметить, мы можем установить больше, чем одну переменных запроса и заставить WordPress выполнять продвинутые запросы с помощью соответствующих пар ключ / значение.

Красивые постоянные ссылки (pretty permalinks) WordPress и структура тегов

Начиная использовать красивые постоянные ссылки, мы создаем удобную, доступную и оптимизированную для SEO структуру URL-адресов. Давайте сравним следующие адреса:

http://example.com/?p=777
http://example.com/some-link/

На первой строке ugly permalink содержит переменную p и ее значение (id поста). В то время, как у pretty permalink в URL-адресе используется специальная фраза, слаг (slug) поста.

WordPress предоставляет для создания красивых постоянных ссылок 4 формата URL-адреса, которые мы можем выбирать в настройках постоянных ссылок, как это показано на скриншоте ниже.

Стандартные форматы постоянных ссылок WordPress

Стандартные форматы постоянных ссылок WordPress

Но мы не ограничены стандартными постоянными ссылками, ведь WordPress позволяет настраивать pretty permalinks с помощью использования одного или больше структурных тегов.

Собственная настройка Pretty Permalinks с помощью структурных тегов

Собственная настройка Pretty Permalinks с помощью структурных тегов

Эти теги – специальные ключевые слова, окруженные символами %. WordPress предлагает следующие теги:

  • %year%
    Год публикации поста (4 цифры)
  • %monthnum%
    Месяц публикации поста (2 цифры)
  • %day%
    День публикации (2 цифры)
  • %hour%
    Час публикации (2 цифры)
  • %minute%
    Минута публикации (2 цифры)
  • %second%
    Секунда публикации (2 цифры)
  • %post_id%
    Уникальный идентификатор поста (числовое значение)
  • %postname%
    Слаг поста (т.е., санитированная строка заголовка поста)
  • %category%
    Слаг категории
  • %author%
    Слаг автора

Поставим в настройках постоянных ссылок переключатель в положение Произвольно и добавим одну из следующих строк в поле ввода:

/%author%/%postname%/
/%year%/%postname%/
/%category%/%postname%/

Любая из этих строк генерирует разные постоянные ссылки с семантическими значениями, как показано ниже:

http://example.com/oleg/some-link/
http://example.com/1993/some-link/
http://example.com/web/some-link/

В первом примере внутри URL-адреса содержится имя автора постов. В двух следующих строках указывается год публикации и категория поста соответственно.
Таким образом, вы можете выбрать наиболее подходящий вам формат постоянных ссылок.

Собственные переменные запроса и продвинутая настройка постоянных ссылок

В дополнение к публичным и приватным переменным запроса WordPress позволяет разработчикам и продвинутым пользователям определять их собственные переменные запроса. После регистрации эти переменные могут быть использованы в строке URL так же, как и публичные переменные запроса. Впоследствии значения переменных применяются для того, чтобы влиять на запросы к БД.

Начиная отсюда, я покажу вам, как построить собственный meta-запрос (т.е. запрос, который возвращает посты по собственному полю, custom field), используя преимущества собственных переменных запроса. Для достижения этой цели мы разработаем плагин регистрации пользовательских переменных, получения их значений и, разумеется, изменения запроса.

В главный файл плагина добавим следующий код:

Рассмотрим этот код подробнее. Сначала мы зарегистрировали переменную с именем city:

Фильтр query_vars позволяет добавлять, удалять или изменять публичные переменные запроса перед его выполнением. Функция обратного вызова в качестве аргумента принимает массив доступных переменных, добавляет новую переменную и возвращает этот же массив.
Вслед за этим мы используем значение переменной для изменения запроса:

Хук действия pre_get_posts срабатывает уже после создания запроса, но еще перед его выполнением. Поэтому мы можем “прицепить” функцию обратного вызова к этому хуку действия, чтобы сделать наши изменения запроса перед его запуском. Вот, что происходит:

  1. Функция обратного вызова принимает в качестве аргумента $query, экземпляр класса запроса. Он передается по ссылке, а не по значению. Это значит, что все изменения объекта запроса будут оказывать влияние на оригинальный запрос, а не на его копию.
  2. Затем мы получает значение параметра city из строки запроса благодаря функции get_query_var.
  3. Наконец, если переменная $city не пуста, мы можем установить элементы мета-запроса meta_key, meta_value и meta_compare. Эти элементы – приватные переменные запроса, которые недоступны для публичных запросов. Значения переменных могут быть установлены только внутри скрипта.

Теперь активируем плагин, добавим пользовательское поле city к нескольким постам и проверим такой URL, как приведен ниже:

http://example.com/?city=Petersburg

В ответ на этот запрос WordPress вернет все посты, где поле city имеет значение Petersburg.

Давайте сделаем их красивыми

Наша последняя задача заключается в том, чтобы конвертировать ugly URL из примера выше в постоянные ссылки с красивой структурой. Добавим следующую функцию в наш плагин:

Функции add_rewrite_tag и add_rewrite_rule являются частью Rewrite API. add_rewrite_tag позволяет WordPress знать о переменной запроса city, в том время как add_rewrite_rule создает новое правило переопределения URL. Благодаря этим двум функциям, мы можем отправлять следующие запросы:

http://example.com/city/Petersburg/

WordPress вернет архив постов, в которых пользовательское поле city имеет значение Petersburg.

Обратите внимание, что каждый раз при добавлении нового правила переопределения URL-адресов необходимо сгенерировать заново постоянные ссылки. Сделать это можно на странице настроек постоянных ссылок. Просто зайдите туда и сохраните настройки, ничего не изменяя.

Заключение

WordPress предоставляет полноценную систему для управления постоянными ссылками. Большая часть функциональности работает сразу из коробки и доступна в панели администратора. Но если потребуется более глубокий контроль над постоянными ссылками, то целый набор хуков и функций позволят вам добавлять свои переменные в строку запроса и переопределять URL-адреса в доступные и оптимизированные для SEO постоянные ссылки.

Источник
Исходный код

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: