Что такое WordPress хуки и как их использовать? Определение Custom Actions. Используем хуки и cron для событий по расписанию

Что такое хуки? Простыми словами хуки это функции wordpress, к которым можно привязать свои функции. В переводе с английского hook это крюк, таким образом вы как бы привязываетесь к стандартной функции. Например, на функцию удаления записи, привязываем свою функцию, которая будет срабатывать только при удалении поста. С помощью грамотного использования хуков, можно значительно расширить базовый функционал WordPress.

Я на маленьком примере покажу, как можно использовать хуки WordPress. За основу возьмем хук публикации поста publish_post, и создадим для него функцию, которая будет добавлять пользователю балы за добавление постов.

Как использовать хук

Хуки используются либо в плагинах, или в functions.php. Чтобы вызвать хук нужно прописать:

Add_action("publish_post", "add_point");

add_point – Название функции, которую вы создаете.

Пример функции с хуком

В моем случае функция работает таким образом:

Пользователь добавляет запись, срабатывает хук который вызывает функцию, в которой происходит вся магия 🙂 В функции я работаю с классом $wpdb->update , где обновляю таблицу с балами конкретного пользователя. В уроке , я рассказывал о классе $wpdb->insert на основе которого вы можете сделать свою функцию с использованием $wpdb->update, данный класс работает аналогичным образом.

Вот как примерно выглядит конструкция с использованием хука:

Function add_point() { //Тут функция } add_action("publish_post", "add_point");

Все что внутри функции, будет срабатывать при публикации поста. Вы можете использовать любой другой хук , который есть на сайте WordPress.

Вот функция с обновлением баллов:

Function add_point() { global $wpdb; $user_ID = get_current_user_id(); $result = $wpdb->get_results("SELECT points FROM user_points WHERE user = "".$user_ID."""); $update = $result->points + 10; $wpdb->update("user_points", array("points" => $update,), array("user" => $user_ID), array("%d",), array("%d")); } add_action("publish_post", "add_point");

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

Вопрос: Жизненный опыт?

Ответ: Так уж получилось, что я пошёл учиться по специальности программиста практически случайно (это была вторая специальность по приоритетам). После обучения посчастливилось сразу устроиться программистом 1С, в итоге я задержался в этой сфере на целых 5 лет.

В итоге, когда в этом стало совсем скучно ковыряться, решил кардинально сменить профиль деятельности и стал ассистентом режиссера на региональном ТВ.

В перерывах между монтажом ТВ-программ решил начать самостоятельно изучать PHP, к тому же, в этот момент у меня появился курс по PHP от Webformyself - собственно, это и дало толчок к возвращению в профессию программиста, но уже с уклоном только на веб.

Первым коммерческим опытом веб-разработки был проект, который я разрабатывал на Joomla, это было долгое, трудное, малоденежное занятие, но я выдержал этот период, набрался опыта и начал понимать, как работать на результат, и как общаться непосредственно с заказчиком. Далее был самостоятельный опыт разработки пары магазинов на Joomla+Virtuemart, знания и решения черпались непосредственно с курса «Интернет-магазин на Joomla» (https://сайт/jshop/).

Затем в жизни случился крутой поворот, я заключил первый полноценный контракт с IT-компанией. После налаживания всех внутренних процессов и понимания стратегии компании, у меня появилось время для дальнейшего саморазвития в области веб-разработчика..

Вопрос:

Ответ: В этом плане сомнения были минимальными, и только в одном - насколько быстро окупятся потраченные средства. А в том, что они окупятся, была полная уверенность.

Вопрос: Назовите самые значимые для Вас убеждения и ценности в жизни в целом и веб-разработке в частности?

Ответ: Главное в жизни - это любовь. Что касается веб-разработки - постоянное развитие и принятие новых вызовов.

Вопрос:

Ответ: Была основная проблема: так как я был полным новичком в мире веб-разработки - у меня не было четкого структурированного плана о том, с чего начать, и в каком направлении действовать. После приобретения курса по PHP я узнал все основы этого языка, как строить приложения, и от этого уже появилось понимание и видение, как и куда это все развивать.

Вопрос: Каких успехов Вы достигли?

Ответ: Моя разработка стала более быстрой и качественной, я овладел несколькими технологиями, избавился от походов в офис, да и вообще профессия веб-разработчика позволяет мне зарабатывать в комфортных для меня условиях и в удобное время.

Вопрос:

Ответ: Семья, дети, путешествия и мое хобби перешло в основную деятельность, которым я зарабатываю (это я про веб-разработку).

Унгер Олег

Я востребован на рынке труда, несмотря на возраст, у меня появилось четкое понимание, в каком направлении мне дальше двигаться

Вопрос: Жизненный опыт?

Ответ: После школы поступал на программиста, но баллов не хватило. Учился на инженера-электронщика. Работал в разных сферах, в основном - на производстве. Та сфера, которая раньше приносила неплохой доход - перекочевала в Китай, работу стало сложно найти, да и надоело уже.

Вопрос: Опишите себя в начале пути?

Ответ: В начале пути я очень сомневался, стоит ли начинать. Меня очень мотивировал пример моего друга, который также начал с нуля и менее чем через год устроился на нормально оплачиваемую работу.

Вопрос: Опишите себя сейчас?

Ответ: Прошло почти три года, я уже обладаю определенными знаниями и постоянно получаю новые благодаря курсам от WebForMySelf.

Вопрос: Как Вы узнали о наших курсах?

Ответ: Стал искать, что же это за школа или курсы какие, где так хорошо и подробно все объясняют. Нашел на YouTube, и далее поиски привели на сайт Webformyself.

Вопрос: Что впервые подумали, когда узнали о нашем проекте?

Ответ: Подумал, как хорошо, что столько информации есть в одном месте.

Вопрос: Вы испытывали какие-то сомнения?

Ответ: Честно говоря, сомнения были. Но я подписался на Премиум клуб. И я многому научился по видео: PHP, JavaScript, регулярные выражения, курс по объектно-ориентированному программированию (ООП PHP) и пр.

Вопрос: Что Вам понравилось?

Ответ: Мне очень понравилось, что бонусом к курсу шли другие курсы и видео из премиум доступа . И так удачно было, что мне не пришлось выбирать между Yii2 и Laravel, потому что они шли в комплекте.

Вопрос:

Ответ: Мне пришлось бы потратить много времени на поиски более-менее структурированной информации по нужным темам.

Вопрос: Каких успехов Вы достигли?

Ответ: Как-то незаметно для себя, стал разбираться в том, что раньше казалось недоступным для понимания. На данный момент почти год работаю программистом (Yii, MS SQL Server, JavaScript), участвую в разработке нового функционала и сопровождении проекта CRM в организации, занимающейся системами безопасности, автоматики и связи.

Вопрос:

Ответ: Чувствую себя уверенно, оптимистично. Планирую и дальше повышать свой профессиональный уровень.

Вопрос: Какие перемены к лучшему произошли в жизни?

Ответ: Перемены к лучшему: я востребован на рынке труда, несмотря на возраст, у меня появилось четкое понимание, в каком направлении мне дальше двигаться. Будущее уже не такое туманное и пугающее, как раньше.

Я никогда не жалел денег на самообразование, а отговорки типа «поздно начинать» или «я не смогу», для меня не приемлемы

Вопрос: Опишите себя в начале пути?

Ответ: В начале пути для меня веб-программирование было «темным лесом», где было страшно и неуютно, но жажда знаний заставила двигаться вперед , да, на Делфи мне приходилось писать парсеры, были написаны Ebay снайпер, программа для участия на тендерах. На данный момент я понимаю, что написать подобное лучше на PHP (не нужно «придумывать велосипед» с библиотекой Synapse).

Вопрос: Что Вы скажете по поводу возражений, с которыми Вы, возможно, сталкивались перед покупкой информационных продуктов, как преодолевали данные возражения (нет денег; у меня не получится; слишком поздно начинать; слишком рано начинать; родственники против; слишком сложно; возможно, какие-либо Ваши возражения)?

Ответ: Я никогда не жалел денег на самообразование, а отговорки типа «поздно начинать» или «я не смогу», для меня не приемлемы - дорогу осилит идущий.

Вопрос: Какую проблему Вы пытались решить, какие проблемы испытывали до приобретения курса?

Ответ: Главной проблемой до приобретения курсов был мой нулевой уровень знаний. Да, конечно, можно на ютубе смотреть кучу бесплатных роликов, тут ты не потратишь денег, но зато потратишь самое ценное - время. На ютуб большинство роликов содержат кучу воды, так как авторы стараются сделать видео максимально длинным, чтобы заработать на рекламе.

Вопрос: О чем Вы думали в начале пути?

Ответ: Нашел через интернет, на тот момент нужно было срочно сделать сайт-галерею, и я приобрел первый курс по верстке. Тот проект я благополучно завалил - не хватало знаний. Сверстать макет я смог, прикрутил даже JQuery, а дальше мои знания закончились, нужна была админка, нужно было хранить где-то данные. Тут произошло мое знакомство с паттерном MVC и желание освоить PHP (с MySQL проблем не было, так как по роду своей деятельности я хорошо знаком с SQL, часто приходится вытаскивать данные из БД в разрезе складов, контрагентов и т.д.).

Вопрос: Какие изменения стали происходить, когда Вы узнали о курсах?

Ответ: Когда я узнал о курсах, изменений никаких не происходило, я просто приобрел сначала один курс и начал изучать, потом второй…. изменения стали происходить во время изучения материала, и эти изменения однозначно в лучшую сторону.

Вопрос: Что могло бы случиться, если бы Вы не смогли решить свои проблемы, если бы Вы не воспользовались нашими продуктами?

Ответ: Вряд ли бы что-то серьезное случилось, веб-разработка - это мое хобби, я не беру денег за это, и берусь лишь за то, что мне действительно интересно. Ну, а что касается именно Ваших продуктов, именно они направляли меня в мире веб-разработки, так как в начале пути я был подобен слепому котенку, мои знания были нулевыми, и я не знал, куда идти, и что делать. Я считаю, в начале пути просто необходим наставник, указывающий тебе путь, и этим наставником для меня как раз и стали Ваши курсы. Да, не все сразу получилось, но главное - не сдаваться.

Вопрос: Каких успехов Вы достигли?

Ответ: Каких успехов добился? Буквально за 2 недели написал сайт для сервисных центров Huawei в Казахстане , сейчас этот сайт уже не действует, так как Huawei интегрировали внесение заявок в свою систему. Писал сайт для транспортной компании с возможностью отследить расположение груза онлайн , сайт интернет-магазина, сайт для сестры - она практикующий психолог. Особо-то и хвастаться нечем, это для меня прежде всего хобби.

Вопрос: Как Вы себя чувствуете? О чем думаете? Какие планы?

Ответ: Планы на будущие, наверное, не останавливаться на достигнутом и продолжить изучение новых технологий в веб-разработке. Возможно, попробую себя в мобильных приложениях, если будет хватать времени.

Мне очень нравятся курсы и уроки Андрея Кудлая. Как по мне, так он просто волшебник в вебе

Вопрос: Жизненный опыт?

Ответ: Начиналось все с верстки, постигал все азы с нуля, начинал брать несложные заказы на фрилансе. Далее познакомился с Joomla, но как-то не срослось с ней, не знаю, почему. Наткнулся на Wordpress - и тут мы нашли друг друга. Начал тщательно изучать эту CMS и плотно с ней работать. Изучил бесплатный курс от WFM по созданию темы с нуля, решил купить сразу курс WordPress-Профессионал - так как там был бонусом еще и курс по PHP, который мне очень нужен был тогда. В процессе изучения пришло понимание, что не все так сложно, как кажется, понемногу начал брать заказы и на создание тем для WordPress. Сейчас на фриланс биржи не заглядываю даже, есть свои постоянные заказчики. Основной профиль - создание тем для Wordpress с нуля.

Вопрос: Опишите себя в начале пути?

Ответ: В начале пути были сомнения - а есть ли деньги в интернете, на фрилансе. Честно говоря, стартовать было непросто - с небольшим опытом и «не толстым» портфолио долго приходилось искать заказчиков. Вообще для себя вывел некую формулу - сначала все всегда кажется страшным, непонятным, невыполнимым, но достаточно разбить большую задачу на этапы и начать делать - как все начинает получаться, складываться. Нужно только не бояться и делать - решение найдется всегда.

Вопрос: Опишите себя сейчас?

Ответ: Сейчас мой основной профиль - это создание тем для WordPress с нуля. На фриланс биржи не заглядываю, есть заказчики и поток постоянной интересной работы. Точно знаю, что заработать в вебе можно. Есть желание расширить свои знания в области PHP, поэтому купил курс PHP мастер от команды WFM от Андрея Кудлая. Его курсы и уроки мне очень нравятся - у него получается прекрасно объяснять материал. Помимо этого, его курсы/уроки мне очень интересно смотреть, они для меня не скучные, что ли. Не знаю, как это объяснить корректно, но на своем пути я встречал много уроков, при просмотре которых хотелось засыпать).

Вопрос: В какой момент Вы решили купить курсы?

Ответ: Понимал, что для дальнейшего роста мне необходим новый набор структурированных знаний. Искал курсы/уроки для себя. На тот момент, в рунете я не видел конкурентов WFM в курсах по WordPress. Вообще я всегда нахожусь в поиске нужных мне качественных материалов для развития.

Вопрос : Что Вам понравилось?

Ответ: Мне очень нравятся курсы и уроки Андрея Кудлая. Как по мне, так он просто волшебник в вебе). Стоит отметить его прекрасный навык в объяснении сложной информации.

Вопрос: Каких успехов Вы достигли?

Ответ: Нашел работу, которая мне очень нравится. Нашел много интересных людей вокруг себя. Получил знания и навыки, которые я могу сейчас свободно продавать. Есть уверенность в завтрашнем дне. Фриланс для меня - это свобода и возможность развиваться, строить себя.

С помощью ваших курсов я научился создавать веб сайты с нуля. Сейчас создаю сайты на заказ

С помощью ваших курсов я научился создавать веб сайты с нуля. Сейчас создаю сайты на заказ. Начал я с нуля. Проблем и вопрос было масса. А конкретных ответов в сети найти практически не возможно.

Ваша команда просто супер. Потому что объясняете доходчиво, чётко все по делу. По-моему друзья вам нету аналогов в сети интернет! Спасибо вам огромное за ваши труды.

Изучив курсы научился создавать сайты!

Что запомнилось больше все из курса? Честно? Все запомнилось!))) Планирую создать свой интернет магазин и внедриться в рынок Армении со своим продуктом. Ещё раз хочу поблагодарить вас. Огромное вам спасибо!

...И перед тем как сдаться я увидела в ютюбе ролик от Автора команды WebForMyself. Посмотрела один, второй и не смогла оторваться

Привет, меня зовут Юлия Ритфелд, я фронт энд разработчик в Министерстве Юстиции в Нидерландах.

Я очень сомневалась купить ли мне курс о Ларавел. Я уже 5 лет работаю верстальщицей и графическим дизайнером и мне всегда казалось, что php (и другие языки бэкенд) - это удел супер умных программистов. Но в какой-то момент мой начальник сказал, что мне надо тоже выучить пхп, а именно Ларавел, чтобы помочь в разработке аппликаций. Я очень долго сомневалась потяну ли такую сложную теорию. Как я как креативный человек смогу ли строить сложные вещи, да еще и в пхп?

Стоит ли инвестировать столько времени и средств?

Я посмотрела курс о Ларавел на lynda.com. Потом купила несколько курсов об этом фреймворке на Udemy.com. Потом были курсы на pluralsight.com. Все было сложно. И даже не в языке дело, на английском я учусь и работаю уже 2 десятка лет. И перед тем как сдаться я увидела в ютюбе ролик Виктора. Посмотрела один, второй и не смогла оторваться.

Но пойдя на данный момент уже 19 из 39 уроков (50%) теоретической части курса о Ларавел хочу сказать с полной уверенностью, что все мои страхи были напрасны. Виктор просто предугадывает мои вопросы и мысли типа ‘а что если..’. Видео записаны в отличном качестве и картинки на которых он объясняет о том, что такое, например, Middleware для меня как визуального человека просто спасение.

С уважением и признанием,
Юлия Рифтелд

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

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

Больше всего, помимо качественной подачи материала, мне нравится стиль подачи. Т.к. всё же мы изучаем материалы самостоятельно, то многие моменты приходится пересматривать несколько раз. Мне нравится что в курсе чёткая структура уроков, я сразу знаю какой урок мне необходимо повторить, чтобы уточнить какой-либо вопрос. Я изучаю записи по нескольку часов и не устаю от прослушивания: голос у авторов курса приятный, спокойный, не торопливый. Это очень важно для меня.

Очень хочу, чтобы мой отзыв помог многим людям, которые находятся в поиске себя, выбирают новое направление деятельности или просто выбирают курс для повышения квалификации.

Возможно я не совсем правильно написал названия этих вещей в заголовке, но я сейчас объясню вам почему.

Хук (hook) — означает крючок.

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

Наши хуки будут делиться на два вида: фильтры и действия.

  • Фильтры позволят вам изменить значения каких-либо переменных перед их возвратом функциями.
  • Действия позволят вам выполнить какой угодно код там, где висит «крючок».
Что важно знать перед началом работы с хуками WordPress? Вам будет намного легче разобраться в механизме хуков, если вы знаете про массивы, функции, чуть-чуть про классы, хорошо понимаете, как работают глобальные переменные.

Также я встречал много кода, где на хук вешается анонимная функция, хотя я и не рекомендую её использовать по нескольким причинам (требуется PHP 5.3.0, некорректно работают с PHP ускорителями, невозможность отмены такого хука функцией или ), но просто знать, что она существует и как выглядит — стоит.

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

Делается это в принципе при помощи двух функций — и .

  • Всё начинается с того, что где-то в коде движка WordPress или плагина находится переменная, на которую в последствии нужно будет воздействовать фильтром. На эту переменную вешается функция и результат действия функции обычно присваивается самой же переменной. Кроме того, тут же задаётся и название фильтра. Например это может выглядит так:
    $x = apply_filters( "misha_filter" , $x ) ;
  • После этого мы уже можем воздействовать на эту переменную извне при помощи . Для этого например в файле functions.php мы создаём функцию с произвольным названием, аргумент функции — переменная $x , внутри функции выполняем с ней все необходимые действия и в конце концов возвращаем результативную переменную. Затем, рядом с функцией вызываем , в которой в качестве параметров указываем название фильтра и название нашей произвольной функции. Меньше слов, больше дела — вот как это может выглядеть:
  • Стоп! Прежде, чем читать пост дальше, опробуйте всё это у себя. Вам не обязательно писать для этого плагин — просто в теме, например в header.php выведите переменную $x и перед выводом примените к ней фильтр, а в файле functions.php этот фильтр и наложите.
  • Простейший пример с содержимым поста внутри самого движка WordPress

    Возможно вы уже где встречали этот пример — он есть в официальной документации WordPress, да и я о нём уже упоминал.

    Скажите, то содержимое поста, которое находится у вас в редакторе в админке и то, которое выводится на сайте одно и то же или отличается?

    Вероятно, это одна из тех вещей, которая фильтруется больше всего, при помощи фильтра the_content на содержимое поста накладываются функции , применяются шорткоды. Кроме того, пользователь тоже мог нагуглить какие-нибудь хуки и с их помощью, скажем, выводить кнопки социальных сетей под постом.

    Чтобы посмотреть наглядно, попробуйте вставить этот код в удобное место в теме, в footer.php или в произвольный :

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

    Делается всё это так же, как и в случае с фильтрами, двумя функциями — и

  • Всё начинается с того, что где-то в коде есть место, в котором потенциально нужно будет выполнить дополнительный код. Это место мы обозначим функцией , в качестве параметра которой укажем название «крючка». Это будет выглядеть очень просто:
  • Ну разве не простой механизм?

    Простейший пример с использованием хука wp_head в WordPress Просто wp_head это первое, что пришло мне сейчас в голову. Итак, прежде всего откройте страницу вашего сайта, откройте её и в виде HTML-кода в браузере. А теперь зайдите в файл header.php и быстрым нажатием клавиши удалите оттуда функцию (она и запускает хук). После этого посмотрите, как сильно изменится ваша страница — исчезнут стили, скрипты, возможно какой-то произвольный код, .Параметры и приоритеты Приоритеты Про приоритеты рассказать гораздо проще, поэтому начну с них. Как вы уже поняли, на один и тот же хук («крючок») имеется возможность повесить довольно много функций. Но ведь иногда эти функции изменяют значение одной и той же переменной, а это значит, что если поменять их местами, то и значение переменной будет другим.

    Покажу простейший пример с использованием анонимных функций (вам нужна версия PHP 5.3.0 или выше) и хуков действий. Если вы вставите этот код куда-нибудь на сайте, то привязанные к хуку функции будут выполняться в порядке подключения в коде

    add_action ("misha_priority" , function () { echo "A" ; } ) ; add_action ("misha_priority" , function () { echo "Б" ; } ) ; add_action ("misha_priority" , function () { echo "В" ; } ) ; // сам хук do_action("misha_priority" ) ; // будет выведено АБВ

    А теперь внимание — функции и третьим параметров поддерживают указание приоритета, с учетом этого видоизменим наш код.

    Как видите, чем выше значение приоритета, тем позднее функция будет подключена к хуку и выполнена.

    Передача дополнительных аргументов в функцию Чего ещё не хватает для полного счастья — передачи в подвешенные на хук функции дополнительных параметров. И эта возможность тоже предусмотрена.

    Всё начинается с того, что в функции или указывается один или несколько параметров.

    do_action( "misha_action" , $param1 , $param2 , $param3 ) ;

    После этого, четвёртым параметром функции

    Ключевая особенность гибкого фундамента WordPress состоит в умелом использовании хуков. Применяемые в темах, плагинах и ядре, хуки позволяют добиться беспрецедентного расширения при сохранении совместимости с последующими версиями WordPress. Отсюда вытекает, что понимание хуков должно составлять обязательную часть «репертуара» разработчиков. Присоединяйтесь к нам – сегодня мы рассмотрим скрытые стороны этой простой, но в то же время мощной системы. О чем пойдет речь: мы пробежимся по концепции хуков, их применению и, естественно, покажем примеры их использования.

    Концепция: что такое хуки и почему они используются?

    За любым качественно написанным программным обеспечением кроется мощная концепция, которая отвечает на вопросы «что такое?» и «почему?». Хуки – не исключение. Говоря простыми словами, хук – это заполнитель для действия. Когда происходит определенное событие, такое как публикация записи, хук активируется, позволяя реализовать соответствующую реакцию. В терминах разработчиков хуки представляют собой пример системы, управляемой событиями.

    Концепция хуков требует более подробного объяснения, нежели простое определение термина – нам нужно понять, чем они полезны. Хуки играют в WordPress ключевую роль вследствие постоянного развития данной системы. Сотни разработчиков постоянно обновляют систему, а значит нет никакой возможности отредактировать базовые файлы каждого плагина, темы или отдельной настройки, так как они будут часто меняться. Вместо этого для расширения системы требуется фреймворк, позволяющий подключать внешнюю функциональность, чтобы добиться такого же мощного эффекта, как и в случае с внутренними манипуляциями. Хуки – ключевая особенность данного фреймворка.

    Как применить хуки?

    Как разработчик, вы должны понимать не только то, что делают хуки или почему они введены, но и знать, как их создавать. Иными словами, чтобы полностью понять систему хуков, нужно разобраться в том, как они применяются.

    По аналогии с письменным тестом, взгляд в ответы – не всегда самая лучшая идея. Как утверждают многие стратегии прохождения тестов, сначала надо прочесть вопрос, сформулировать свои собственные мысли по поводу ответа, и затем уже принять решение, которое ближе всего отвечает вашему обоснованию. Подобный метод может быть применен в процессе изучения разработки программного обеспечения; вместо того чтобы заглядывать в чей-либо код, чтобы понять, как реализуется та или иная особенность, зачастую полезнее сначала написать его самостоятельно, и затем уже вернуться назад и изучить его работу. Именно так мы и поступим.

    Работа с документацией

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

    • add_action($hook, $function [, $priority [, $numArgs ] ]) – задает обработчик функции $function, который вызывается в том случае, если определенный хук $hook активирован в результате возникновения события. $priority определяет, будет ли данный обработчик функции вызван до или после других обработчиков функций (по умолчанию переменная равна 10). Чем меньше этот показатель, тем раньше будет вызвана функция. $numArgs – количество аргументов, принимаемых обработчиком функции (по умолчанию 1).
    • do_action($hook [, $arg1 [, $arg2 [, $arg3 [, … ] ] ] ]) – активирует определенный хук $hook путем вызова всех обрабатываемых функций с необязательными аргументами $arg1, $arg2, $arg3 и т.д.

    Теперь, когда у нас в одной руке находится документация, мы можем сделать некоторые выводы по поводу этих двух функций. add_action просто связывает функцию, приоритет и количество аргументов со строкой. Это напоминает идеальную задачу для PHP массивов, которые также работают как хэш-карты, хранящие пары ключ-значение. do_action более тривиальная функция – она обращается к этому массиву, разыскивает функциональные обработчики и вызывает их впоследствии. Держа в памяти нашу схему, самое время перейти к применению хуков.

    Применяем полученные знания на практике

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

    Перед тем как начать, давайте создадим план действий:

    • Нам понадобится глобальный массив, который будет доступен для обеих функций.
    • add_action сохранит в массив заданное имя хука и набор соответствующих обработчиков в виде пары ключ-значение.
    • do_action получит обработчики функций из массива для заданного хука и вызовет каждый из них.

    Код будет выглядеть следующим образом:

    $actions = array(); function add_action($hook, $function) { global $actions; // create an array of function handlers if it doesn"t already exist if(!isset($actions[ $hook ])) $actions[ $hook ] = array(); // append the current function to the list of function handlers $actions[ $hook ] = $function; } function do_action($hook) { global $actions; if(isset($actions[ $hook ])) { // call each function handler associated with this hook foreach($actions[ $hook ] as $function) call_user_func($function); } }

    Отлично; мы создали универсальную систему хуков с помощью примерно 20 строк кода. Теперь, когда у нас есть идея того, как работают хуки, давайте погрузимся в код ядра WordPress, чтобы подтвердить наши гипотезы.

    Быстро перемещаться по коду можно с помощью разных инструментов – таких как, к примеру, Yoast’s PHP Cross Reference of the WordPress Source.

    Поиск по «add_action» выдает следующий код:

    Function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) { return add_filter($tag, $function_to_add, $priority, $accepted_args); } function add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1) { global $wp_filter, $merged_filters; $idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority); $wp_filter[$tag][$priority][$idx] = array("function" => $function_to_add, "accepted_args" => $accepted_args); unset($merged_filters[ $tag ]); return true; }

    add_action вызывает add_filter, который, в свою очередь, добавляет заданную функцию в массив, связанный с хуком $tag. Несмотря на то, чтобы здесь мы также используем параметры $priority и $accepted_args, данная функция полностью отвечает нашим предположениям. do_action будет чуть длиннее и сложнее:

    Function do_action($tag, $arg = "") { do { foreach ((array) current($wp_filter[$tag]) as $the_) if (!is_null($the_["function"])) call_user_func_array($the_["function"], array_slice($args, 0, (int) $the_["accepted_args"])); } while (next($wp_filter[$tag]) !== false); }

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

    Примеры

    Обладая пониманием работы хуков, давайте взглянем на два следующих примера. Первый пример – работа с RSS; вместо того чтобы рассылать уведомления через синдикацию, почему бы не использовать для этого электронную почту?

    Система почтовых уведомлений

    Чтобы реализовать данную систему, нам нужно получить дату публикации записи. Однако какой хук мы должны использовать для этого? Описание API действий предлагает список хуков наряду со связанными с ними событиями, что поможет нам получить ответ на поставленный выше вопрос. Описание хука publish_post подходит под наши требования, потому давайте добавим обработчик функций к нему:

    Add_action("publish_post", "notify_via_email");

    Все, что нам осталось сделать, – это отправить уведомление по электронной почте в обработчике функции notify_via_email. Обратите внимание, что хук publish_post передает ID записи как аргумент в нашу функцию. Это позволит нам получить информацию о записи с помощью функции get_post:

    Function notify_via_email($post_id) { $post = get_post($post_id); $to = "[email protected] /* */ "; $subject = "Post Published on " . get_bloginfo("name"); $message = $post->post_title . " was published on " . get_bloginfo("name") . " as of " . $post->post_date . ". You may view it at " . get_permalink($post_id) . "."; wp_mail($to, $subject, $message); }

    После получения записи мы применим ее заголовок, дату и постоянную ссылку в нашем почтовом сообщении. Оно затем будет отправлено с помощью функции wp_mail, которая требует адрес получателя, тему письма и сообщение в качестве своих параметров. Со всем этим наша система отправки почтовых уведомлений готова. Обратите внимание, что не рекомендуется вызывать сразу несколько функций wp_mail за один раз, поскольку это ведет к заметной задержке загрузки страниц после того, как нажата кнопка публикации записи.

    Плагин Google Analytics

    Наше первое приложение, пусть несколько надуманное, выступило кратким введением в использование хуков. Теперь мы приведем второй пример, который будет уже более близок к реальному использованию на практике. Мы создадим простой плагин Google Analytics, который автоматически вставит код отслеживания в футер страницы.

    Сначала может показаться, что тема является более подходящей средой для такого кода. Но это лишь мнимое представление, ибо тема сайта восприимчива к версиям и изменениям. Код аналитики может легко потеряться при переходе от одной темы к другой. Создание плагина позволяет избежать этой проблемы, поскольку он будет оставаться активным вне зависимости от используемой темы. Вам не придется вносить какие-либо изменения в тему всякий раз после ее замены.

    Но как добавить код в футер сайта? Все так же – с помощью хуков. Если вы работали с WordPress темами раньше, вы, вероятно, вызывали функции wp_head и wp_footer в хэдере и футере вашего сайта соответственно. Обе эти функции просто активируют хуки, чтобы плагины могли легко добавлять свой код в эти жизненно важные области страницы. Следовательно, мы просто добавим действие к хуку wp_footer:

    Add_action("wp_footer", "add_google_analytics_code");

    Наша функция add_google_analytics_code, как и предполагает ее название, печатает код Google Analytics:

    var _gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]]; (function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t); g.async=g.src="http://www.google-analytics.com/ga.js"; s.parentNode.insertBefore(g,s)}(document,"script"))

    Обязательно измените UA-XXXXX-X на ваш личный ID, зависящий от сайта. В итоге все заработает. Просто добавьте указанный код в файл и загрузите его в вашу папку с плагинами. Убедитесь в том, что плагин содержит заголовок — к примеру, такой:

    Одним из краеугольных камней выполнения задач в 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 , или в плагин, или в любой тип проекта, с которым мы работаем: