✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Учебное пособие: Пользовательские конечные точки URL с API перезаписи WordPress

16

Вы когда-нибудь хотели расширить отдельные сообщения, страницы или свои пользовательские типы сообщений с помощью собственного шаблона, который сохраняет собственную структуру URL? С WordPress Rewrite API это вполне возможно и совсем не сложно.

В этом уроке мы рассмотрим, как добавить представление одного пользовательского типа записи к другому слагу, который загружает другой шаблон. Другими словами, если одно сообщение пользовательского типа имеет URL-адрес «example.com/destination/venice/», вы можете добавить правила URL для отдельных страниц с соответствующей информацией для каждого места назначения, например «example.com/destination/venice». /деятельности/» и «example.com/destination/venice/attractions/».

Если вам интересно, как добавить конечные точки на страницу «Моя учетная запись» WooCommerce, у меня есть еще один пост об этом!

WordPress Rewrite API имеет множество полезных функций для написания собственных правил URL. Возможно, вы видели самую известную и широкую функцию; add_rewrite_rule(). Однако в этом руководстве используется аналогичный add_rewrite_endpoint(), который очень полезен для добавления «конечных точек» URL-адресов (по сути, добавления пользовательских слагов URL-адресов после того, что уже существует, например, после окончания отдельного сообщения или отдельной категории). Вы можете добиться того же результата с помощью, add_rewrite_rule()но процесс добавления конечных точек проще.

Что мы будем делать

В этом руководстве предполагается, что мы создали два пользовательских типа сообщений; «кино» и «актер». Правило постоянной ссылки для одного фильма — «example.com/movie/fight-club/», а для одного актера — «example.com/actor/brad-pitt/». Нам нужна отдельная страница для каждого фильма, на которой показаны все актеры в этом фильме, расположенная по адресу «example.com/movie/fight-club/actors/», и аналогично отдельная страница для каждого актера, на которой показаны все фильмы, в которых снимался этот актер. находится по адресу «example.com/actor/brad-pitt/movies/».

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

Написание кода

Первым шагом является вызов add_rewrite_endpoint()функции, подключенной к init(обычно все функции в Rewrite API подключаются к init). зарегистрировать две наши желаемые конечные точки; «кино» и «актеры». Функция принимает два аргумента ; во-первых, конечная точка, которую вы хотите (например, «фильмы»), а во-вторых, константа для того, где конечная точка должна «жить» (например, страницы, автор, архивы и т. д.). Посмотрите в документации, какие константы вы можете использовать; как для этого примера общее EP_PERMALINKв порядке:

add_action('init', function() { add_rewrite_endpoint('movies', EP_PERMALINK); add_rewrite_endpoint('actors', EP_PERMALINK); });

NB: Если ваш пользовательский тип записи является иерархическим, то есть он имеет 'hierarchical' => trueв своем register_post_type(), вам нужно отключить константу EP_PERMALINKс EP_PAGES.

После сохранения этого кода вам нужно перейти в «Настройки»> «Постоянные ссылки» и просто нажать кнопку «Сохранить», чтобы обновить постоянные ссылки. Всякий раз, когда вы добавляете или изменяете правило перезаписи, вам нужно обновить свои постоянные ссылки, чтобы оно работало!

Обработка переменных запроса

Вы, как разработчик темы или плагина, можете выяснить, показывать ли шаблоны для этих конечных точек, проверяя «переменные запроса»; в основном глобальный объект запроса WordPress. Мы делаем это, вызывая get_query_var()запрос в качестве аргумента («фильмы» или «актеры»).

Если вы работали с add_rewrite_rule()или get_query_var()раньше, вы, возможно, уже знаете, что WordPress не добавляет автоматически настраиваемые переменные запросов. Обычно вам нужно отфильтровать query_varsи добавить свои пользовательские переменные, чтобы WordPress их заполнил. Однако add_rewrite_endpoint()автоматически делает это за нас.

Однако, если мы попытаемся вызвать get_query_var('movies'), он никогда не будет установлен. Это потому, что он предполагает, что он должен иметь значение, чтобы быть установленным. Правила конечной точки предполагают, что все, что идет после конечной точки, является значением. Например, «example.com/actor/brad-pitt/movies/some-value/» будет работать, потому что на этой странице get_query_var('movies')будет возвращено значение «some-value». Но это не то, чего мы хотим, мы хотим, чтобы это работало только с одной конечной точкой. Чтобы решить эту проблему, нам нужно подключиться к requestфильтру WordPress и сообщить WordPress, что если мы находимся в наших конечных точках, переменные запроса должны добавить конечную точку с некоторым значением (мы просто устанавливаем для нее значение true).

add_filter('request', function($vars) { if (isset($vars['movies'])) { $vars['movies'] = true; } if (isset($vars['actors'])) { $vars['actors'] = true; } return $vars; });

Если вы попробуете сейчас использовать get_query_vars('movies')when на «example.com/actor/brad-pitt/movies/», вы получите значение true(важно то, что оно действительно установлено).

Загрузка шаблона

Следующий шаг — решить, что должно происходить на этих двух конечных точках; или, другими словами, какие шаблоны вы хотите загрузить. Эта часть зависит от вас, вы можете подключиться template_redirect, но это действительно рекомендуется только в том случае, если вы хотите выполнить фактическое перенаправление. Я рекомендую подключиться к template_includeфильтру и просто указать WordPress, какие шаблоны использовать, когда мы находимся на наших пользовательских конечных точках. Предположим, что в теме есть шаблоны PHP single-actor-movies.phpдля «example.com/actor//movies/» и single-movie-actors.php«example.com/movie//actors/».

add_filter('template_include', function($template) { if (is_singular() && get_query_var('movies')) { $post = get_queried_object(); return locate_template(['single-actor-movies.php']); } if (is_singular() && get_query_var('actors')) { $post = get_queried_object(); return locate_template(['single-movie-actors.php']); } return $template; });

С этим фильтром WordPress должен загружать предоставленные шаблоны для наших пользовательских конечных точек, и в этих шаблонах глобальный $postобъект будет связанным с одним объектом публикации перед конечной точкой — например, объект публикации одного актера, когда мы находимся в шаблоне для отображения всех фильмы, в которых снялся актер. Это позволяет нам легко запрашивать информацию, которую мы хотим показать.

Получение URL-адреса вашей конечной точки

Наличие наших пользовательских конечных точек и страниц — это прекрасно, но где-то вам нужно будет на них ссылаться. Например, в шаблоне одного фильма вам нужна ссылка «Просмотреть всех актеров», которая ведет к вашей конечной точке.

К сожалению, такой простой функции WordPress для этого нет. Вам нужно будет создать URL самостоятельно. Я рекомендую использовать [get_site_url](https://developer.wordpress.org/reference/functions/get_site_url/)()для конечных точек всего сайта, или в приведенном выше случае вы бы ссылались на конкретную публикацию [get_the_permalink](https://developer.wordpress.org/reference/functions/get_the_permalink/)()(либо внутри цикла, либо путем предоставления идентификатора публикации) и добавляли конечную точку после нее, например:

echo get_the_permalink(). '/actors';

Источник записи: awhitepixel.com

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