Изменение структуры URL-адреса пользовательской публикации с разбиением на страницы
У меня есть пользовательский тип публикации для слайд-шоу, который создает публикацию с разбиением на страницы, и каждый слайд представляет собой отдельную страницу. Данные для каждого слайда сохраняются в настраиваемых полях, и каждый слайд имеет набор заголовков, сохраненный в настраиваемом поле с ключом slide{$i}-title
($i
будучи номером слайда, например slide1-title
).
В настоящее время URL-адрес каждой последующей страницы - это номер, добавляемый к постоянной ссылке на публикацию (это стандартный способ форматирования URL-адресов страниц с разбиением на страницы) следующим образом: http://example.com/post-title/2 / для страницы/слайда 2 и http://example.com/post-title/3 / для страницы/слайда 3.
Как я могу изменить это, чтобы к URL-адресу каждой страницы добавлялся заголовок слайда вместо добавочного номера?
Например: http://example.com/post-title/slide-2-title / для страницы/слайда 2 и http://example.com/post-title/slide-3-title / для страницы/слайда 3.
1 answers
Изменение структуры URL-адресов всегда состоит из двух частей: две части изменяют URL-адреса, которые вы создаете с помощью своего кода, и одна для обработки входящих URL-адресов новой структуры. Я сосредоточусь на второй и, возможно, наименее понятной части.
Входящие URL-адреса сопоставляются с различными правилами перезаписи , которые являются регулярными выражениями, которые могут соответствовать URL-адресу. Эти выражения могут иметь группы захвата , которые захватывают часть URL-адреса для отправки его в другой запрос переменные, которые (например) используются для построения запроса к базе данных. Если вы создадите пользовательский тип записи slideshow
, одно из правил перезаписи будет выглядеть следующим образом:
slideshow/([^/]+)(/[0-9]+)?/?$ => index.php?slideshow=$matches[1]&page=$matches[2]
Это означает, что мы сопоставляем URL-адрес, начинающийся с slideshow/
, затем все, что не является /
, и необязательно (?
) /
и любое количество цифр. Первое совпадение отправляется в переменную запроса slideshow
, второе совпадение - в переменную page
. Например, slideshow/nature/2
установит slideshow
в nature
и page
в 2
. Я написал плагин, который может быть полезен для понимания и отладки ваших текущих правил.
Вы хотели бы соответствовать структуре, подобной slideshow/nature/slide-2-canyon/
. Регулярное выражение для этого выглядит следующим образом:
slideshow/ // Start with 'slideshow/' ([^/]+) // Then anything that is not '/' (/slide- // Then 'slide-' ([0-9]+) // A page number (-([^/]+))? // Slide title: '-' and anything that is not '/'. Optional so you don't have to add it )?/?$ // Which could be followed by a '/'
Мы хотим записать название слайд-шоу и номер страницы. Вы считаете открытие '(', чтобы получить индексы соответствия, поэтому наше полное правило перезаписи выглядит так:
slideshow/([^/]+)(/slide-([0-9]+)(-([^/]+))?)?/?$ => index.php?slideshow=$matches[1]&page=$matches[3]
Теперь нам просто нужно добавить это в правила перезаписи. Убедитесь, что вы поместили его сверху, так как аналогичное правило используется для сопоставьте вложения сообщения, и ваше пользовательское правило никогда не будет применено, если оно находится в нижней части списка.
add_rewrite_rule(
'slideshow/([^/]+)(/slide-([0-9]+)(-([^/]+))?)?/?$',
'index.php?slideshow=$matches[1]&page=$matches[3]',
'top'
);
Достаточно вызвать эту линию только один раз, а затем flush_rewrite_rules()
. Или, если вы не хотите возиться с крючками активации плагинов, вызывайте add_rewrite_rule()
на каждом init
, но затем загрузите страницу настроек "Постоянная ссылка", чтобы очистить правила. До тех пор, пока вы не очистите правила при каждой загрузке страницы, потому что это дорогостоящий расчет.
Единственное, что вам остается, - это генерировать ссылки на страницы нового формата. wp_link_pages()
кажется, не предлагает фильтров для изменения его вывода, поэтому я бы изучил, как он работает, и продублировал его в вашем формате страницы (это несложно, и вам нужна только половина функции, если вы выберете только один формат вывода).