Создание плагина для WordPress: Хуки в WordPpress: action и filter. Часть 3

Ромчик
1

Создание плагина для WordPressДоброго времени суток. Мы продолжаем цикл статей по созданию плагина “Популярные статьи” для WordPress. Пока к написанию плагина мы не приступили, но зато уже реализовали данный функционал и  встроили его в нашу тему. Для реализация функционала “Популярные статьи” мы выбрали два способа: первый способ, использования стандартной таблицы WordPress https://web-programming.com.ua/sozdanie-plagina-populyarnye-stati-chast-1/, и второй способ, когда мы создали для хранения данных о количестве просмотров статьи собственную таблицу https://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. Хуки делятся на два вида:

  1. Actions (действия) — служат для добавления определенных функций. Например, при отображении отдельного поста мы хотим вызвать определенную функцию, тогда мы можем применить следующее действие the_post
  2. Filters (фильтры) — служат для изменения определенных функций, например при публикации поста мы хотим добавить к нему определенный текст (подпись), тогда мы можем воспользоваться фильтром publish_post

Actions

Action — это действия по заданным событиям. Т.е. Ваш плагин может реагировать на событие, выполняя определенную функцию, которая может:

  1. Изменить базу данных
  2. Послать сообщение
  3. Изменить то, что отображается на экране браузера.

Для того, чтобы воспользоваться hook-ом, необходимо:

  1. Создать php функцию, которая выполниться при достижении определенного события
  2. Подключить созданную функцию к некоторому событию

Для того, чтобы  подключить функцию к некоторому событию используется следующая конструкция:

add_action ( 'hook_name', 'your_function_name', [priority], [accepted_args] );

где:

  1. hook_name — название события,
  2. your_function_name — название функции, которая будет вызываться при наступлении события hook_name,
  3. priority — дополнительный аргумент целое число, которое может быть использовано, чтобы определить порядок, в котором функции, связанные с конкретным действием выполняются (по умолчанию: 10). Более низкие значения соответствуют ранее исполнению, а функции с одинаковым приоритетом выполняются в том порядке, в котором они были добавлены к действию.
  4. accepted_args — дополнительный аргумент целое число, которое определяет  сколько аргументов ваша функция может принять (по умолчанию 1). Иногда очень полезный параметр, потому, что некоторые хуки могут передать в функцию более чем один аргумент.

Filters

Фильтры в отличие от actions предназначены для фильтрации данных, они получают некоторые данные и возвращают уже измененные данные. Для того, чтобы воспользоваться фильтром необходимо:

  1. Создать функцию
  2. Подключить созданную функцию к некоторому фильтру.

Для того, чтобы подключить функцию к некоторому фильтру используется следующая конструкция:

add_filter ( 'hook_name', 'your_filter', [priority], [accepted_args] );

где:

  1. hook_name — название события,
  2. your_function_name — название функции, которая будет вызываться при наступлении события hook_name,
  3. priority — дополнительный аргумент целое число, которое может быть использовано, чтобы определить порядок, в котором функции, связанные с конкретным действием выполняются (по умолчанию: 10). Более низкие значения соответствуют ранее исполнению, а функции с одинаковым приоритетом выполняются в том порядке, в котором они были добавлены к действию.
  4. 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.
На этом я данную статью завершаю, а в следующей мы начнем создавать плагин.

Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger

  • Леонид - 26.02.2015 в 13:24

    Спасибо что разъяснили! Очень качественно преподноситься информация.

  • ©2012-2017 По всем вопросам обращайтесь через форму обратной связи

    Яндекс.Метрика