如何防止do_action语句重复执行

时间:2013-01-25 作者:Emerson Maningo

是否有任何方法可以防止do\\u操作语句的重复执行?例如,我有以下几行:

do_action(\'myhook1\', \'myfunction1\');
do_action(\'myhook2\', \'myfunction2\');
do_action(\'myhook3\', \'myfunction3\');
还有其他插件“可能”正在执行它们。

是否有内置WordPress功能或某种方法来防止do\\u操作语句的双重执行?我需要的是,一旦它们被激活或执行?Wordpress只会忽略其他do\\u操作语句。

类似于这种情况:

if (!(already_executed)) {
//not executed
//execute the do_action lines

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


}

2 个回复
最合适的回答,由SO网友:Ralf912 整理而成

检查是否有人已经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\' );

SO网友:fuxia

有两种方法:

一次传递所有参数:

do_action( \'myhook1\', \'myfunction1\', \'myfunction2\', \'myfunction3\' );
// or
do_action( \'myhook1\', array ( \'myfunction1\', \'myfunction2\', \'myfunction3\' ) );
创建自定义操作,将参数作为名称的一部分(如果是标量):

do_action( \'myhook1_myfunction1\' );
do_action( \'myhook1_myfunction2\' );
do_action( \'myhook1_myfunction3\' );
注意第二个参数do_action()not 一个函数,它是一个字符串。所以,当其他人用这个钩子add_action() 除非在一个页面上使用完全相同的钩子两次,否则不会调用任何函数两次。

结束

相关推荐

hooks & filters and variables

我是updating the codex page example for action hooks, 在游戏中完成一些可重用的功能(最初是针对这里的一些Q@WA)。但后来我遇到了一个以前没有意识到的问题:在挂接到一个函数以修改变量的输出后,我再也无法决定是要回显输出还是只返回它。The Problem: 我可以修改传递给do_action 用回调函数钩住。使用变量修改/添加的所有内容仅在回调函数中可用,但在do_action 在原始函数内部调用。很高兴:我将其修改为一个工作示例,因此您可以将其复制/粘贴