Изменение структуры 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.

Author: Johannes Pille, 2010-11-15

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() кажется, не предлагает фильтров для изменения его вывода, поэтому я бы изучил, как он работает, и продублировал его в вашем формате страницы (это несложно, и вам нужна только половина функции, если вы выберете только один формат вывода).

 8
Author: Jan Fabry, 2017-04-13 12:37:50