如何为所有WordPress钩子添加单一函数

时间:2015-03-29 作者:pavanravikanth

如何为所有WordPress操作/事件添加单个WordPress函数。

我想添加一些与下面的内容等效的内容

add_Action(\'All WordPress Event/Actions\', \'My_Function\');
我还想让这个函数兼容,这样我可以得到所有系统隐式参数,如下所示

  • My_Function($content);

  • My_Function($postId);

$content$postId 是WordPress系统传递的隐式参数。。。

2 个回复
SO网友:fuxia

有一项特别行动all 您可以使用的。请注意,这将非常缓慢,不要在生产中这样做。

以下是一个示例:

add_action( \'all\', function() {

    static $hooks = [];

    $filter = current_filter();

    if ( isset ( $hooks[ $filter ] ) )
        return;

    $types  = array_map( function ( $arg ) {
        return gettype( $arg );
    }, func_get_args() );

    $hooks[ $filter ]  = count( $types ) . \' arguments: \' . join( ",\\t", $types );

    if ( \'shutdown\' !== $filter )
        return;

    $text = "\\n\\nFILE: " . $_SERVER[\'REQUEST_URI\'] . \' \' . date( \'Y.m.d. H:i:s\' ) . "\\n\\n";

    foreach ( $hooks as $hook => $args )
        $text .= str_pad( $hook, 50 ) . " => $args\\n";

    $file = WP_CONTENT_DIR . \'/hook.log\';
    file_put_contents( $file, $text, FILE_APPEND | LOCK_EX );
});
现在,您可以在一个文件中列出所有挂钩hooks.log. 示例输出:

FILE: /wp-admin/admin-ajax.php 2015.03.29. 17:25:41

muplugins_loaded                                   => 1 arguments: string
pre_site_option_siteurl                            => 2 arguments: string,  boolean
site_option_siteurl                                => 2 arguments: string,  string
pre_option_siteurl                                 => 2 arguments: string,  boolean
option_siteurl                                     => 2 arguments: string,  string
gettext_with_context                               => 5 arguments: string,  string, string, string, string
gettext                                            => 4 arguments: string,  string, string, string
registered_taxonomy                                => 4 arguments: string,  string, string, array
sanitize_key                                       => 3 arguments: string,  string, string
post_type_labels_post                              => 2 arguments: string,  object
registered_post_type                               => 3 arguments: string,  string, object
post_type_labels_page                              => 2 arguments: string,  object
post_type_labels_attachment                        => 2 arguments: string,  object
post_type_labels_revision                          => 2 arguments: string,  object
post_type_labels_nav_menu_item                     => 2 arguments: string,  object
theme_root                                         => 2 arguments: string,  string
pre_option_active_plugins                          => 2 arguments: string,  boolean
…

SO网友:David Lawrence

这是一个非常糟糕的主意。

您可以通过这样做来实现这一点:

add_action( \'init\', function(){
    do_action()//rinse recycle repeat for every hook
});
我强烈建议你不要走这条路。这可能会导致很多问题,如不需要时挂钩开火等。

钩子的思想是扩展在给定时间处理的流程的功能,它们提供的数据仅在某些操作(如添加注释)期间可用。

如果对每个钩子都执行\\u操作,则可能是灾难性的。更不用说你没有每个钩子的数据了。

如果您希望在每次加载页面时启动函数,那么请使用init挂钩,因为admin面板仅使用admin\\u init

但不要在一个钩子中触发每一个WordPress操作。这不是个好主意

只是为了掩盖all 地面

执行:

add_action( \'init\', function(){
    add_action( \'hook\', function(){
        // do code here
    })
})
这将在每个钩子上激发函数,但不要在一个钩子上激发每个钩子。当然,您会对每个要启动函数的挂钩执行单独的add\\u操作,但没有真正的启动挂钩的方法。

重用代码的更好途径可以是:

add_action( \'init\', function(){
    $hooks = array(
            \'hook1\',
            \'hook2\',
            \'hook3\'//and so on.
        );

    foreach( $hooks as $hook ){

        add_action( $hook, function(){
            // Do code
        });
    }

    // Do the same but in add_filter
});
同样,为了覆盖所有理由,直接在上面的方法将添加操作/筛选器,但操作/筛选器在使用apply\\u filter或do\\u操作激发之前不会激发,这只是将函数添加到操作或筛选器。

然后,您必须接受函数的参数,而不提供add\\u action上的第四个参数,您保证只有一个参数,因此您必须在代码中过滤您使用的参数,以及一些if或else。

对于详细说明arg的评论,您可以执行类似的操作:

add_action( \'init\', function(){
        $hooks = array(
                \'hook1\' => array( \'argname1\', \'argname2\', \'argname3\' ),
                \'hook2\' => array( \'argname1\', \'argname2\', \'argname3\' ),
                \'hook3\' => array( \'argname1\', \'argname2\', \'argname3\' )//and so on.
            );

        foreach( $hooks as $hook=>$args  ){
            add_action( $hook, function(){

                $numargs = func_num_args();
                for( $i=0; $i<$numargs; $i++ ){
                    $$args[$i] = func_get_arg($i);
                }
                // Do code
            }, 10, count( $args ) );
        }

        // Do the same but in add_filter
    });
然后使用for,显然可以判断避免错误所需的参数数量。

为了更好地避免错误,请先检查$args[$i]是否存在或不为空,然后再为其设置func\\u get\\u arg。

回复评论:下面是一个实时示例,说明如何将其用于save\\u post操作

add_action( \'init\', function(){
    $hooks = array(
        \'save_post\' => array( \'post_id\', \'post\', \'update\' )
    );

    foreach( $hooks as $hook=>$arg ){
        add_action( $hook, function(){ // Note we dont do any args here  
            $num_args = func_num_args(); // would return 3 because we supplied 3 args
            for( $i=0; $i<$num_args; $i++ ){
                if( !empty( $arg[$i] ) ){
                    $$arg[$i] = func_get_arg( $i );
                    // We use !empty as it will check if isset AND not empty
                    // This would set all three array values to the respective variable
                    //       $post_id, $post, $update
                    // Make sure you put the args in the right order in the hooks array above to avoid mixing up var names.

                }
            }

            if( isset( $post ) ){
               update_post_meta( $post->ID, \'meta_key_whatever_you_want\', \'meta_value_whateveryouwant\' );
                // I used $post to show you that the second argumnet supplied by do_action is $post and we set $$arg[1] as $post and retrieved the arg with same key 1 Normally you would just use post_id

            }

            // Can do with any of the args just be carefull.
        }, 10, count( $args ) ); 
        // We count the hook arg array which is the array with simple strings for our variable names and supply it to add_action to let wordpress know we want 3 arguments. If you supply more than 3 arguments you may get errors for this hook, so setting array with 50 args for a hook that only supplies 3 is not good.
        // 10 is simply priority in which this hook fires.
    }
});
这只是实现这一点的一种方法,然后只需为钩子执行一个数组键,为每个钩子的参数执行一个数组,并检查变量是否已设置。您可能需要对变量进行一些额外的验证,以确保您拥有正确的数据,因为某些挂钩共享变量名称,但您可以自定义,因此$post\\u id可以设置为$$arg[0],并且在arg数组中设置为“post\\u id\\u custom”,使用挂钩$post\\u id提供的数据将其设置为$post\\u id\\u custom。

还有一件事,要真正完全简化事情,您也可以这样做:

function someFunc(){
 // do code here
}

add_action(\'hook1\', \'someFunc\' );
add_action(\'hook2\', \'someFunc\' );
add_action(\'hook3\', \'someFunc\' );
add_action(\'hook4\', \'someFunc\' );
这将激发与所提供的所有动作挂钩相同的乐趣。

add_action( \'all\', function() {
    static $hooks = [];
    global $allhooks;

    $filter = current_filter();

    if ( isset ( $hooks[ $filter ] ) )
        return;

    $types  = array_map( function ( $arg ) {
        return $arg;
    }, func_get_args() );

    $hooks[$filter] = $types;

    if( \'shutdown\' !== $filter )
        return;

    foreach( $hooks as $hook=>$args ){
        $allhooks[$hook] = $args;
    }

});

add_action( \'shutdown\', function(){
    global $allhooks;
    var_dump( $allhooks );
});
这将打印挂钩附带的所有挂钩和所有参数供参考。对toscho代码的简单修改,它会为每个钩子转储类似的内容。

array (size=809)
  \'after_setup_theme\' => 
    array (size=1)
      0 => string \'after_setup_theme\' (length=17)
  \'ot_theme_mode\' => 
    array (size=2)
      0 => string \'ot_theme_mode\' (length=13)
      1 => boolean false
  \'ot_child_theme_mode\' => 
    array (size=2)
      0 => string \'ot_child_theme_mode\' (length=19)
      1 => boolean false
  \'ot_show_pages\' => 
    array (size=2)
      0 => string \'ot_show_pages\' (length=13)
      1 => boolean true
这只是将其转储到浏览器中,简单地重复并帮助您解释toscho所说的参数名称不仅仅是提供的值。

经过审查,它缺少像save\\u post这样的挂钩。因此,即使是all钩子也不能提供每个动作和过滤器。

真的没有办法做到这一点,这真的是个坏主意。

再说一次,我不是WordPress专家。

结束

相关推荐

在加载plugins_后,get_plugins()不工作

知道为什么下面的代码function my_plugin_load() { get_plugins(); } add_action( \'plugins_loaded\', \'my_plugin_load\' ); 抛出此错误?Fatal error: 不应调用未定义的函数get\\u plugins()get_plugins() 定义在plugins_loaded 胡克开火了?如果不是,那么什么才是合适的钩子呢?(这个钩子应该启动插件的引导/加载过程)