Intereting Posts
Как изменить сетку галереи с 4 столбцов на 3 столбца? Multisites – выберите главную страницу на основе местоположения Перенаправление страницы WordPress Можно ли полностью заменить сообщение действием / фильтром? wordpress "hooks" для скриптов плагинов? Показать DISQUS на главной странице Попытка изменить отображаемое изображение с 180×180 до полной ширины на главной странице wp_star_rating () не отображает звезды в сообщении WordPress Пользовательские изображения Gravatar не отображаются. Загрузка по умолчанию вместо Как получить определенное изображение для всех, кто комментирует? gettext не переводит при вызове ajax Показать пользовательский тип сообщения внутри настраиваемого типа сообщения Как отредактировать фактическое выпадающее меню в TinyMCE с пользовательскими стилями текста Когда целесообразно создать новую таблицу в базе данных WordPress? Как вставить пользовательский виджет в пользовательскую боковую панель при активации темы?

Как предотвратить двойное выполнение операторов do_action

Есть ли способ предотвратить двойное выполнение операторов do_action? Например, у меня есть следующие строки:

do_action('myhook1', 'myfunction1'); do_action('myhook2', 'myfunction2'); do_action('myhook3', 'myfunction3'); 

Существуют и другие плагины, которые «могут» выполнять их.

Есть ли встроенная функция WordPress или некоторые средства предотвращения двойного выполнения do_action-операторов? Мне нужно, чтобы как только они были активированы или выполнены? WordPress просто игнорирует другие инструкции do_action.

Что-то вроде этого условия:

 if (!(already_executed)) { //not executed //execute the do_action lines do_action('myhook1', 'myfunction1'); do_action('myhook2', 'myfunction2'); do_action('myhook3', 'myfunction3'); } 

Чтобы проверить, myhook1 ли кто-то подключен к myhook1

 if( 0 >= did_action( 'myhook1' ) ) do_action( 'myhook1', 'myfunction1' ); 

Если вы хотите проверить, была ли функция myfunction1 уже вызвана (может быть, простым вызовом функции), вам нужно установить «маркер»,

 function myfunction1 ( $some_args ) { // with a simple global define (a bad solution) define( 'MYFUNCTION1_DONE', TRUE ); // or with the globals array (also a bad solution) $myfunction_calls = isset( $GLOBALS['myfunction_calls'] ) ? $GLOBALS['myfunction_calls'] : array(); if( ! is_array( $myfunction_calls ) ) $myfunction_calls = array(); $myfunction_calls[__FUNCTION__] = TRUE; $GLOBALS['myfunction_calls'] = $myfunction_calls; // or with database // // you have to reset the database entry everytime the script ends // this is can be done by add_action( 'shutdown', 'reset_myfunctioncalls_db_entry' ); // or in a class with a __destruct() method $myfunction_calls = get_option( 'myfunction_calls', TRUE ); if( ! is_array( $myfunction_calls ) ) $myfunction_calls = array(); $myfunction_calls[__FUNCTION__] = TRUE; upodate_option( 'myfunction_calls', $myfunctions ); [... some other code ...] } 

Перед вызовом do_action() вы можете проверить, была ли эта функция уже вызвана

 if( ! defined( 'MYFUNCTION1_DONE' ) || TRUE !== MYFUNCTION1_DONE ) do_action( 'myhook1', 'myfunction1' ); // or $myfunction_calls = isset( $GLOBALS['myfunction_calls'] ) ? $GLOBALS['myfunction_calls'] : array(); if( ! isset( $myfunction_calls['myfunction1'] ) || TRUE !== $myfunction_calls['myfunction1'] ) do_action( 'myhook1', 'myfunction1' ); // or $myfunction_calls = get_option( 'myfunction_calls', TRUE ); if( ! isset( $myfunction_calls['myfunction1'] ) || TRUE !== $myfunction_calls['myfunction1'] ) do_action( 'myhook1', 'myfunction1' ); 

Существует два способа:

  1. Передайте все параметры сразу:

     do_action( 'myhook1', 'myfunction1', 'myfunction2', 'myfunction3' ); // or do_action( 'myhook1', array ( 'myfunction1', 'myfunction2', 'myfunction3' ) ); 
  2. Создавайте собственные действия с параметром как часть имени (если оно является скаляром):

     do_action( 'myhook1_myfunction1' ); do_action( 'myhook1_myfunction2' ); do_action( 'myhook1_myfunction3' ); 

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