Создание плагина для WordPress: Хуки в WordPpress: action и filter. Часть 3
Доброго времени суток. Мы продолжаем цикл статей по созданию плагина “Популярные статьи” для WordPress. Пока к написанию плагина мы не приступили, но зато уже реализовали данный функционал и встроили его в нашу тему. Для реализация функционала “Популярные статьи” мы выбрали два способа: первый способ, использования стандартной таблицы WordPress http://web-programming.com.ua/sozdanie-plagina-populyarnye-stati-chast-1/, и второй способ, когда мы создали для хранения данных о количестве просмотров статьи собственную таблицу http://web-programming.com.ua/sozdanie-plagina-populyarnye-stati-chast-2/. Но добавления функционала в тему — это не правильно и чревато большими проблемами. Об этом Вы можете прочитать в статье “Плагины против тем в WordPress”. Давайте продолжим подготовку к созданию плагина для WordPress. В предыдущих статьях реализацию функционала мы добавили в файл functions.php. А вызов функции обновления счетчика количества просмотров находился в файле single.php. Давайте перенесем функцию вызова счетчика в файл functions.php (это нам надо для того, чтобы весь код находился в одном файле) и для этого нам понадобиться использовать так называемые hooks (хуки) WordPress. Так, что же такое hooks (хуки) в WordPress?
Для чего нужны хуки?
Hook — это некоторая функция в WordPress, при выполнении которой мы можем вызвать пользовательскую функцию. Т.е. при вызове hook WordPress проверит не привязано ли к нему пользовательская функция и если привязана, то выполнит ее. Тем самым мы можем существенно увеличить функционал нашего ресурса не изменяя ядро самого движка WordPress. Хуки делятся на два вида:
- Actions (действия) — служат для добавления определенных функций. Например, при отображении отдельного поста мы хотим вызвать определенную функцию, тогда мы можем применить следующее действие the_post
- Filters (фильтры) — служат для изменения определенных функций, например при публикации поста мы хотим добавить к нему определенный текст (подпись), тогда мы можем воспользоваться фильтром publish_post
Actions
Action — это действия по заданным событиям. Т.е. Ваш плагин может реагировать на событие, выполняя определенную функцию, которая может:
- Изменить базу данных
- Послать сообщение
- Изменить то, что отображается на экране браузера.
Для того, чтобы воспользоваться hook-ом, необходимо:
- Создать php функцию, которая выполниться при достижении определенного события
- Подключить созданную функцию к некоторому событию
Для того, чтобы подключить функцию к некоторому событию используется следующая конструкция:
add_action ( 'hook_name', 'your_function_name', [priority], [accepted_args] );
где:
- hook_name — название события,
- your_function_name — название функции, которая будет вызываться при наступлении события hook_name,
- priority — дополнительный аргумент целое число, которое может быть использовано, чтобы определить порядок, в котором функции, связанные с конкретным действием выполняются (по умолчанию: 10). Более низкие значения соответствуют ранее исполнению, а функции с одинаковым приоритетом выполняются в том порядке, в котором они были добавлены к действию.
- accepted_args — дополнительный аргумент целое число, которое определяет сколько аргументов ваша функция может принять (по умолчанию 1). Иногда очень полезный параметр, потому, что некоторые хуки могут передать в функцию более чем один аргумент.
Filters
Фильтры в отличие от actions предназначены для фильтрации данных, они получают некоторые данные и возвращают уже измененные данные. Для того, чтобы воспользоваться фильтром необходимо:
- Создать функцию
- Подключить созданную функцию к некоторому фильтру.
Для того, чтобы подключить функцию к некоторому фильтру используется следующая конструкция:
add_filter ( 'hook_name', 'your_filter', [priority], [accepted_args] );
где:
- hook_name — название события,
- your_function_name — название функции, которая будет вызываться при наступлении события hook_name,
- priority — дополнительный аргумент целое число, которое может быть использовано, чтобы определить порядок, в котором функции, связанные с конкретным действием выполняются (по умолчанию: 10). Более низкие значения соответствуют ранее исполнению, а функции с одинаковым приоритетом выполняются в том порядке, в котором они были добавлены к действию.
- accepted_args — дополнительный аргумент целое число, которое определяет сколько аргументов ваша функция может принять (по умолчанию 1). Иногда очень полезный параметр, потому, что некоторые хуки могут передать в функцию более чем один аргумент.
Отлично, что такое actions и filters мы разобрались, более подробно о фильтрах и действиях Вы можете прочитать в официальной документации по WordPress. В ближайшее время я попытаюсь выложить подробный список хуков в WordPress с их описанием. А пока продолжим создавать наш плагин для WordPress.
Создание действия для вызова функции изменения счетчика просмотров
В предыдущих статьях для вызова функции изменения счетчика просмотра статьи мы в файл single.php добавили следующий код:
<?php setViews(get_the_ID()); ?>
Удалим этот кусок кода и перейдем в файл functions.php. Найдем в этом файле описание функции setViews(get_the_ID()). Для первого способа:
<?php function setViews($postID) { $key = 'post_views'; $count = get_post_meta($postID, $key, true); if($count==''){ $count = 0; delete_post_meta($postID, $key); add_post_meta($postID, $key, '0'); }else{ $count++; update_post_meta($postID, $key, $count); } } ?>
Для второго способа это:
<?php function setViews() { if (is_single()) : $postID = get_the_ID(); global $wpdb; $table = $wpdb->prefix."popularposts"; $result = $wpdb->get_results("SELECT * FROM $table WHERE post_id = $postID"); foreach ($result as $c): $count = $c->count; endforeach; if (!isset($count)) : $count = 1; $wpdb->insert($table, array('post_id'=>$postID,'count'=>$count), array('%d','%d') ); else: $count = $count+1; print_r($count); $wpdb->update( $table, array('count' =>$count), array('post_id'=>$postID), array('%d'), array('%d')); endif; endif; }
И добавим после описания функции setViews следующий код:
<?php add_action('the_post','setViews'); ?>
Что мы сделали? Мы добавили действие, которое при наступлении события the_post вызывает функцию setViews. А событие the_post возникает при отображении отдельного поста.
Давайте проверим, что у нас получилось.
Наш функционал работает как и прежде, только теперь мы избавились от добавления php кода в файл single.php.
На этом я данную статью завершаю, а в следующей мы начнем создавать плагин.
Спасибо что разъяснили! Очень качественно преподноситься информация.
Каким хуком можно просто распечатать HTML в месте, указанном через шорт-код?