Wordpress

WordPress do action: do_action() | Function | WordPress Developer Resources

07.10.2022

плагинов — методы do_action и ловушки

Ваша аналогия здесь частично верна, но неполна:

Я так понимаю, что при вызове do_action wp ищет все зарегистрированные слушателей и вызывает их в соответствии с установленным приоритетом.

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

Имея это в виду, полезнее использовать аналогию с событиями.

  • do_action('init') Запустить действие ‘init’
  • add_action('init', 'myfunction' ) Когда происходит событие init , вызовите myfunction
  • function myfunction() {} Ах, произошло событие init

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

Возьмем ваш пример вызова add_action в нижнем колонтитуле для действия wp_head . wp_head срабатывает, когда вызывается wp_head() , что должно происходить в заголовке между тегами

. Если мы попытаемся добавить действие в нижний колонтитул, то оно будет добавлено, и при следующем вызове wp_head() оно сработает. Но wp_head уже вызывали, уже поздно. Это все равно, что попросить ребенка «не забыть собрать сумку перед вечеринкой» сразу после окончания вечеринки.

Имея это в виду, у меня есть несколько общих правил и рекомендаций, которые могут служить эвристикой для более удобного в сопровождении кода:

  • Поместите весь код в функции, которые срабатывают при возникновении событий. init , after_theme_setup , wp_head и admin_init должны покрывать большую часть
  • Единственным кодом вне хука или фильтра Будут файлы шаблонов, и начальный add_action вызывает
  • Не добавляйте фильтры и хуки внутрь шаблонов, делайте это в functions.
    php
    или плагин, или если эти файлы используют include или требуют операторов для папки include

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

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

  • Действия делают вещи
  • Фильтры изменяют вещи
  • Действия не должны ничего возвращать
  • Фильтрам передается то, что «фильтруется», в качестве первого аргумента, и они всегда возвращают его или модифицированную версию
  • Фильтров называют много, поэтому никогда не выполняйте тяжелую работу в фильтрах, это сильно замедлит работу, только модифицируйте, выполнение работы — вот что такое действия для
  • Будьте осторожны, подключаясь к фильтрам преобразования и экранирования, это может быть опасно и сильно влияет на производительность, так как эти фильтры чаще всего называются фильтрами
  • Существует особенно опасное действие/фильтр под названием all
    , которое будет срабатывать для каждого фильтра и хука. Иногда полезно для отладки, но я бы рекомендовал вместо этого использовать плагин, такой как монитор запросов.

Основы хуков действий в WordPress

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

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

Показательный пример: я писал о шаблоне проектирования, управляемом событиями (или публикация-подписка или Pub/Sub, как некоторые любят его называть) в других постах.

Да, у каждого есть отличия, но общая идея такова, что что-то 9Происходит 0023, и возникает событие, и все, кто прослушивает это событие или подписался на это событие, ответит.

Photo by Claus Grünstäudl on Unsplash

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

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

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

Хуки действий в WordPress

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

Ну и что — это , хороший способ думать о шаблоне Pub/Sub? Википедия определяет это как:

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

Понимание паттерна

Поначалу это может показаться сложным. Я не знаю, но давайте разберем это:

  1. Существует сервис, в нашем случае это WordPress, который отвечает за публикацию сообщений на , кто бы ни подписался на (он не обязательно знает, кто слушает).
  2. Когда подписчик слушает, он будет предпринимать действия всякий раз, когда он слышит это действие.
  3. После завершения выполнения кода подписчика программа вернется к исходной точке выполнения (куда издатель отправил сообщение).

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

Асинхронная функциональность может попасть в потоки или Ajax через эти важные темы, это не тот пост.

Как это выглядит в WordPress?

Возможно, самый простой способ описать этот конкретный шаблон в WordPress — использовать вызовы функций:

  • сделать_действие
  • add_action

Иногда номенклатура может сбивать с толку, но проще говоря, do_action публикует и событие и add_action подписывает на событие. Или, возможно, лучше представить это так: :

do_action указывает WordPress выполнять любые добавленные действия.

Иногда полезно запомнить простые фразы, как все работает. Я не знаю, является ли приведенная выше фраза самой запоминающейся или запоминающейся, но это что-то , верно?

Кроме того, обратите внимание, что do_action и add_action являются базовыми для WordPress и также доступны для нашей разработки.

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

Для do_action :

Эта функция вызывает все функции, прикрепленные к хуку действия $tag . Можно создать новые хуки действий, просто вызвав эту функцию, указав имя нового хука с помощью Параметр $tag .

Или еще проще:

Выполнение функций, привязанных к определенному хуку действия.

Когда речь идет о хуках, это могут быть либо хуки, определенные WordPress

, либо пользовательские хуки, которые вы указываете в своей теме или плагине.

Аналогично add_action :

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

И, аналогично, проще говоря:

Привязывает функцию к определенному действию.

Установка этого значения на практике немного отличается, потому что обычно мы используем add_action для добавления собственного кода в WordPress.

Практический пример

Например, возможно, вы написали что-то вроде этого:

Посмотрите код на Gist.

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

Добавление собственных хуков

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

На самом деле, на мой взгляд, это намного проще, чем работать с add_action , потому что add_action обеспечивает не только подключение к существующему издателю, но и добавление собственной пользовательской логики.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *