✅ WEB і WordPress новини, теми, плагіни. Тут ми ділимося порадами і кращими рішеннями для сайтів.

Підручник: користувацькі кінцеві точки URL-адреси з API перезапису WordPress

13

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

У цьому підручнику ми розглянемо, як додати один настроюваний тип подання до іншого слага, який завантажує інший шаблон. Іншими словами, якщо окрема публікація спеціального типу має URL-адресу «example.com/destination/venice/», ви можете додати правила URL для окремих сторінок із пов’язаною інформацією для кожного призначення, наприклад «example.com/destination/venice». /activities/» і «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); });

Примітка. Якщо ваш користувацький тип публікації є ієрархічним, тобто він має '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, щоб покращити ваш досвід. Ми припустимо, що з цим все гаразд, але ви можете відмовитися, якщо захочете. Прийняти Читати далі