Одним із наріжних каменів виконання завдань у WordPress є розуміння принципів роботи хуків (зачіпок). Саме собою це не складно, а в цій статті ми постараємося ознайомити вас з основами.
Але навіть якщо ви хочете отримати більш глибокі пізнання, то вам все одно необхідно знати, як застосовувати хуки.
Ми розповімо вам про систему хуків WordPress та їх використання, а також розглянемо хуки дії та фільтрів.
Дивіться також:
- Додавання кастомних хуків до WordPress: Custom Filters
- Поради для початківців розробку сайту на WordPress
- Посібник з кастомних типів записів WordPress
- Custom Post Types: таксономії, фільтри та архіви в WordPress
- Що таке Формати постів у WordPress і для чого вони потрібні
- Що слід знати про формати постів у WordPress
Перед тим, як почати, переконайтеся, що ви маєте все необхідне для роботи, і ви маєте останню версію WordPress.
Що таке хуки?
Перед тим, як ми розглянемо WordPress хуки, необхідно зрозуміти подієво-орієнтовану архітектуру розробки.
Якщо ви працювали з уже існуючими хуками WordPress, або з фронтендом веб-розробкою, або з JavaScript, то ви, швидше за все, знайомі з цим поняттям, навіть якщо не знали, що у нього є офіційна назва.
Ось його визначення в Вікіпедія:
Архітектура, керована подіями (англ. event-driven architecture, EDA) є шаблоном архітектури програмного забезпечення, що дозволяє створення, визначення, споживання та реакцію на події.
Якщо ви тільки почали працювати з шаблонами проектів або розробкою, це може здатися вам складним, але краще сприймати це так:
- Програмне забезпечення в певні моменти може надсилати вам повідомлення про якусь подію.
- Ми, як розробники, здатні написати код, який відстежує ці повідомлення, а потім відповідає на них кодом користувача.
Зверніть увагу, що у визначенні йдеться і про створення подій. Коли ми обговорюватимемо наші власні хуки, то повернемося до цієї теми. А тепер давайте розглянемо дві події, поширені у веб-розробці.
Використання JavaScript
Уявіть, що ви працюєте у сфері фронтенд розробки. У вас є кнопка з атрибутом ID command-button, і коли користувач натискає на неї, то відкриється діалогове вікно.
За допомогою jQuery ви можете реалізувати цей функціонал так:
(function( $ ) { 'use strict'; // jQuery's DOM-ready event-handler $(function() { /** * Listen for the 'click' event on the button identified * with the 'command-button' ID attribute. * * When the user clicks on it, display an alert dialog. */ $( '#command-button' ).bind( 'click', function( evt ) { alert( 'You clicked the button.' ); }); }); })( jQuery );
Коментарі у коді пояснюють принцип роботи. Коротше кажучи, браузер відтворює подію, коли користувач натискає кнопку. Коли це відбувається, код відстежує події, а потім відповідає, виводячи на екран діалогове вікно.
Звичайно, інші бібліотеки, платформи або vanilla JavaScript пропонують той самий набір функцій. Причиною того, чому ми розповідаємо про jQuery, є те, що це одна з найпоширеніших бібліотек JavaScript, і тому що вона пов'язана з WordPress.
Використання WordPress
Застосування цього шаблону залежить від мови програмування або парадигми. Це часто залежить від API, який надає платформа або програма.
У WordPress реєстрація власного коду, що запускає події, дещо відрізняється. Наприклад, уявимо, що ви працюєте з адміністративною сторінкою в WordPress і хочете додати новий елемент підменю в меню Налаштування. Назвемо його Tuts+ Options.
Для цього ми додаємо наступний код у файл functions.php, або в плагін, або в будь-який тип проекту, з яким ми працюємо:
<?php add_action( 'admin_menu', 'tutsplus_admin_menu' ); /** * Adds a 'Tuts+ Options' submenu to the 'Settings' * menu in the WordPress administration menu. */ function tutsplus_admin_menu() { add_submenu_page( 'options-general.php', 'tutsplus-admin-menu', 'Tuts+ Options', 'manage_options', 'tutsplus-admin-menu-top', 'tutsplus_admin_options' ); }
Ви можете зайти на Codex, щоб більше дізнатися про хуки admin_menu та функції add_submenu_page.
Цей код не додає жодних нових функцій у меню, але він показує, що WordPress надає подію admin_menu так само, як браузер надає події на кліку. Ми тоді зможемо ввести власний код, визначивши функцію, і запускаючи її при виникненні події.
Це і є два приклади реалізації та використання подієво-керованого шаблону розробки.
Розуміння WordPress Actions
Ми встигли ознайомитися з подієво-керованим шаблоном розробки та двома видами реалізації шаблонів, а тепер розглянемо хуки дій WordPress. Ми розповімо про доступні хуки та їх застосування.
Налаштування нашого файлу
Для коду в цьому посібнику ми будемо використовувати тему двадцять Шістнадцять, що надається WordPress.
Створіть файл під назвою tutsplus-actions.php в корені директорії теми. Потім у functions.php додайте наступні рядки коду:
<?php include_once( 'tutsplus-actions.php' );
Це дає команді тему завантажувати файл, який ми визначили. Ми це робимо для того, щоб не впроваджувати код в ядро теми і легко видалити код, прибравши включити_одного разу.
Коротке визначення Actions
У WordPress хуки можуть бути двох видів: хуки дій (Actions) та хуки фільтрів (Filters). Хуки дій дозволяють вам додавати, видаляти чи змінювати певні функції. А хуки фільтрів відповідають за додавання, видалення та зміну інформації.
Коротше кажучи, хуки дій працюють із функціональністю, а фільтри з інформацією.
Вивчивши більше інформації про хуки дій та фільтрів, ви можете знайти й інші, під загальною назвою хуки.
Хоча технічно все правильно, але краще визначити тип хука, над яким працюєте.
Тому що хуки дій виконують одні функції, а фільтри зовсім інші.
Робота з Actions
Хоча ми вже розглянули приклади хуків дій у коді вище, давайте поглянемо більш повні і практичні приклади.
WordPress пропонує два види записів: Записи (для регулярних записів блогу) та Сторінки (для постійного контенту або контенту, який буде змінюватися нечасто). Для звичайної платформи блогів цього достатньо. Але WordPress вже давно перетворився на CMS.
А однією з особливостей, що робить WordPress розширюваним є можливість представляти власні типи записів (custom post types). WordPress називає їх типами записів, і вони знадобляться, якщо вам потрібно створити тип контенту, якому потрібен власний тип атрибутів, і якому не підходять назви «запис» або «сторінка».
Для того, щоб створити власний тип запису, нам потрібно виконати дві речі:
- Визначити функцію, яка чіпляється за хук ініціалізації, як зазначено на WordPress
- Зареєструвати тип запису за допомогою однієї з доступних функцій API
Реєстрація Action
Щоб зареєструвати наш хук дії, ми використовуємо функцію add_action, що надається WordPress API. Це повідомляє WordPress, що ми представляємо хук дії і що потрібно запустити функцію, визначену назвою, яку ми вказали у виклику функції.
Наш код має виглядати так:
<?php add_action( 'init', 'tutsplus_register_post_type' );
У цьому коді ми реєструємо функцію з хуком ініціалізації, що існує у WordPress. Цей хук запускає цикл WordPress, і це підходящий час для реєстрації користувача типу запису.
Тепер необхідно визначити функцію.
<?php function tutsplus_register_post_type() { }
Ключ до розуміння назви функції простий: Ми назвали її tutsplus_register_post_type, оскільки це другий аргумент, який ми перемістили на виклик add_action.
Він буквально каже WordPress робити таке: під час ініціалізації викликати функцію tutsplus_register_post_type.
Поки що непогано. Ми не зробили нічого складного, і якщо ви оновите вашу адміністративну сторінку WordPress, побачите, що нічого не змінилося в її роботі.
Давайте це виправимо.
Створення користувача типу запису
Тепер ми маємо основу коду для додавання нашого власного хука дії. Давайте тепер створимо тип користувача запису з назвою time_traveler, який містить лише заголовок, редактор та цитату.
Для цього нам необхідно розглянути функцію register_post_type у Codex. Документація надасть нам список всіх аргументів, які функція може обробити, але для нашого типу запису ми використовуємо тільки деякі з них.
Ми вибрали такі:
- етикетка
- етикетки
- description
- громадськість
- show_ui
- опори
Ми сподіваємося, що решта функцій WordPress надає автоматично. Аргументи виглядатимуть так:
<?php $args = array( 'label' => 'Time Travelers', 'labels' => array( 'name' => 'Time Travelers', 'singular_name' => 'Time Traveler', 'add_new_item' => 'Add New Traveler', 'edit_item' => 'Edit Traveler', 'new_item' => 'New Traveler', 'view_item' => 'View Traveler', 'search_items' => 'Search Travelers', 'not_found' => 'No Travelers', ), 'description' => 'A post type used to provide information on Time Travelers.', 'public' => true, 'show_ui' => true, 'supports' => array( 'title', 'editor', 'excerpt', ), );
І нарешті, повна версія коду для реєстрації типу запису:
<?php add_action( 'init', 'tutsplus_register_post_type' ); function tutsplus_register_post_type() { $args = array( 'label' => 'Time Travelers', 'labels' => array( 'name' => 'Time Travelers', 'singular_name' => 'Time Traveler', 'add_new_item' => 'Add New Traveler', 'edit_item' => 'Edit Traveler', 'new_item' => 'New Traveler', 'view_item' => 'View Traveler', 'search_items' => 'Search Travelers', 'not_found' => 'No Travelers', ), 'description' => 'A post type used to provide information on Time Travelers.', 'public' => true, 'show_ui' => true, 'supports' => array( 'title', 'editor', 'excerpt', ), ); register_post_type( 'time_traveler', $args ); }
Після оновлення консолі має з'явитися новий пункт прямо під коментарями під назвою Time Travelers.
Коли ви натиснете Додати нову, ви побачите місце для заголовка (або імені мандрівника), редактор (для інформації мандрівника) та цитату (напевно, для нотаток про мандрівника). Ви також побачите метаполе для публікації інформації.
Звичайно, наведений вище код показує нам, як отримати вигоду від існуючих хуків дій для визначення типу користувача запису. Але що якщо ми хочемо створити власний хук дії?
Визначення Custom Actions
Коли настає час створити власні хуки дії, необхідно зробити три базові речі:
- визначити хук
- наділити хук функцією
- дозволити розробникам викликати хук
Найпростіший приклад:
<?php /** * Define the action and give functionality to the action. */ function tutsplus_action() { do_action( 'tutsplus_action' ); } /** * Register the action with WordPress. */ add_action( 'tutsplus_action', 'tutsplus_action_example' ); function tutsplus_action_example() { echo 'This is a custom action hook.'; }
Не бійтеся додавати цей код у tutsplus-actions.php, Ви зможете вивчити його детальніше після прочитання нашої статті.
Після цього ми можемо викликати нашу функцію tutsplus_action у будь-якому місці коду. Давайте уявимо, наприклад, що хочемо відобразити її вгорі адмін сторінки. Для цього потрібно додати наступний код:
<?php add_action( 'admin_notices', 'tutsplus_admin_notice' ); function tutsplus_admin_notice() { tutsplus_action(); }
Після оновлення консолі ви побачите напис «This is a custom action hook» вгорі консолі.
Ми не рекомендуємо додавати хуки в admin_notices, якщо ви не плануєте надсилати користувачам повідомлення про помилку або вдале виконання дій. Ми просто показуємо це, як приклад хука користувача.
До питання про наш тип запису
Давайте уявимо, що ми хочемо створити функцію користувача типу запису, яка дозволяє нам перетворювати назву типу запису в однині і множині в функцію, використовуючи хук дії.
Як це зробити? Для початку потрібно створити функцію користувача, яка буде викликати хук дії. Давайте зробимо це:
<?php function tutsplus_register_custom_post_type() { // Set the action at priority of 10 and note that it accepts 2 arguments. do_action( 'tutsplus_register_custom_post_type', 10, 2 ); }
Далі нам потрібно зробити те, що може здатися трохи нелогічним. Оскільки ми хочемо, щоб наша функція користувача запускалася в контексті хука ініціалізації, нам потрібно переконатися, що наш хук запуститься під час дії ініціалізації.
Для цього ми приєднуємо наш хук користувача до хука ініціалізації:
<?php add_action( 'init', 'tutsplus_register_custom_post_type' ); function tutsplus_register_custom_post_type() { // Set the action at priority of 10 and note that it accepts 2 arguments. do_action( 'tutsplus_register_custom_post_type', 10, 2 ); }
Зверніть увагу, що у вищевикладеному коді ми вказали два додаткові параметри для зробити_дію. Першим параметром є 10 який показує пріоритет запуску хука.
Параметром може бути будь-яке число, і чим воно вище, тим нижче буде запуск у списку пріоритетів. Другим параметром є кількість аргументів, які прийме хук користувача. У нашому випадку є один для версії типу запису в однині, і один для версії типу запису в множині.
Після цього нам необхідно наділити хук функціоналом. Ми виконаємо перепроектування коду для реєстрації типу запису, щоб він прийняв два аргументи, які будуть використані в масиві, переданому WordPress функції register_post_type.
<?php function tutsplus_register_post_type( $singular, $plural ) { $args = array( 'label' => $plural, 'labels' => array( 'name' => $plural, 'singular_name' => $singular, 'add_new_item' => 'Add New Traveler', 'edit_item' => 'Edit Traveler', 'new_item' => 'New Traveler', 'view_item' => 'View Traveler', 'search_items' => 'Search Travelers', 'not_found' => 'No Travelers', ), 'description' => 'A post type used to provide information on Time Travelers.', 'public' => true, 'show_ui' => true, 'supports' => array( 'title', 'editor', 'excerpt', ), ); register_post_type( 'time_traveler', $args ); }
Зауважте, що ми не додаємо цю функцію до конкретного хука. Натомість, ми викличемо її з визначення функції, яка пов'язана з нашим користувальницьким дією.
<?php add_action( 'tutsplus_register_custom_post_type', 'tutsplus_register_time_traveler_type' ); function tutsplus_register_time_traveler_type() { tutsplus_register_post_type( 'Time Traveler', 'Time Travelers' ); }
У вказаному вище коді ми можемо викликати функції, що відповідають за реєстрацію користувача типу запису, передаючи наші власні аргументи, щоб додати кілька функцій користувача в код.
Підсумки
Неважко зрозуміти, що таке хуки. Вони додають розробникам потужності та гнучкості. Можливо, найбільшою річчю в коді є визначення хука в контексті іншого хука (визначення tutsplus_register_custom_post_type в ініціалізації).
Ми вирішили навести його як заключний приклад, тому що бувають випадки, коли вам потрібно зареєструвати хук користувача і запустити його до виконання вже існуючого хука.
Реєструвати хук легко: ви просто повинні не з'єднувати його з існуючим, і зробіть виклик базової функції, як у коді admin_notices.
Коментарі до запису: 0