Hooks are not executing

时间:2013-02-11 作者:TheWebs

根据我对钩子的理解,您可以通过do\\u action(“hook\\u name”)创建一个钩子;然后向所述钩子中添加一些内容,并在希望它执行钩子的位置调用该方法,因此:

public function hook_name(){
    do_action(\'hook_name\');
}
有些地方你会做类似的事情:

add_action(\'hook_name\', \'some_hook\');
然后在主题中的一些地方,你称之为:

hook_name();
好了,在这里调用钩子将执行的函数。我试图创建一个类来简化这个过程,因为如果你有一个主题,比如说50000个钩子(不要问为什么,我要走极端),那就是50000个函数,就像我上面做的那样。

因此基于:This previous post 我试图创建一个类,例如:

<?php

class AisisCore_Hooks{

    protected $_hooks;

    public function __construct($hooks){
        $this->_hooks = $hooks;

        $this->_setup_hooks($this->_hooks);

        $this->init();
    }

    public function init(){}

    protected function _setup_hooks($hooks){
        foreach($hooks as $hook=>$param){
            if(is_array($param)){
                do_action($hook, implode(\',\', $param));
            }else{
                do_action($hook);
            }
        }
    }

}
然后我试着做:

$array = array(
    \'hook_name_one\'
);

$hooks = new AisisCore_Hooks($array);

function test(){
    echo "I am a test for this idea";
}

add_action(\'hook_name_one\', \'test\');
但很快就意识到我在做一个与之无关的动作。所以我的问题是:

在我的类中,我是否希望传入一个动作名称和一个函数,并添加动作,然后向外调用Do\\u action()?

因此:

protected function _setup_hooks($hooks){
    foreach($hooks as $tag=>$action){
        add_action($tag, $action);
    }
}
然后执行以下操作:

do\\u action(//标记是什么);

3 个回复
最合适的回答,由SO网友:Debbie Kurth 整理而成

do\\u操作位于错误的位置。它在呼唤自我。

您有:

   public function hook_name()
    {
     do_action(\'hook_name\');
    }
执行以下操作:

  do_action(\'hook_name\');
  public function hook_name()
   {
   do_action(\'other_hook_name\');
   }

SO网友:s_ha_dum

您正在使用的挂钩创建模式。。。

public function hook_name(){
    do_action(\'hook_name\');
}
有些地方你会做类似的事情:

add_action(\'hook_name\', \'some_hook\');
。。。是我记得不久前做过的事情,许多或大部分在线教程都建议这样做。但是,如果您在源代码中grep一个没有(已知)相应函数的钩子,如the_content 这是一个钩子和一个模板标记。。。

grep -Rni \'pre_get_posts\' *
。。。然后再次grep查找关联函数。。。

grep -Rni \'function pre_get_posts\' *
。。。很多钩子都找不到。核心不使用该选项public function hook_name(){ do_action(\'hook_name\'); } 在每一种情况下,它似乎并没有被用来实际创建钩子。看来do_actionapply_filters 做所有的工作。上的示例Codex page for do_action 确认这一点。该示例使用了一个名为i_am_hook 但是没有这个名字的函数,只有do_action( \'i_am_hook\', $a, $b );. 你可以通过做一些非常简单的事情来证明这一点,比如:

function test_new_action($a,$b) {
  var_dump($a,$b);
}
add_action(\'new_action\',\'test_new_action\',1,2);
$a = \'abc\';
$b = \'def\';
do_action(\'new_action\',$a,$b);
我发现了几个最近的教程,但我相信还有更多,演示了同样的事情:

您根本不需要创建这些函数,也不需要启动“空”挂钩。你只需要使用do_actionapply_filters 您需要运行挂钩的位置。

您只需创建这些function hook_name(){ do_action(\'hook_name\'); } 当且仅当您希望通过使用Core的方式按名称调用钩子来运行钩子时,函数才起作用the wp_head and wp_footer hooks.

因此,我认为对于大多数钩子和您可能想按名称调用的钩子,您根本不需要这样做,您没有创建允许您这样做的函数。我唯一能让它起作用的方法是eval-- 非常粗略的概念证明:

$funcnames = array(
  \'funcone\',
  \'functwo\'
);
foreach ($funcnames as $f) {
  $str = \'function \'.$f.\' () { do_action("\'.$f.\'"); }\';
  eval($str);
}
function test_new_action_v2() {
  var_dump(\'Howdy\');
}
add_action(\'funcone\',\'test_new_action_v2\');
function test_new_action_v3() {
  var_dump(\'Ho\');
}
add_action(\'functwo\',\'test_new_action_v3\');
funcone();
functwo();
我认为这是唯一的方法,但这会对速度造成一些影响,并且可能会有范围问题,特别是考虑到您是在类中执行它(但我还没有对此进行测试)。请参见:https://stackoverflow.com/questions/7337883/php-define-functions-with-variable-names

希望这将为您提供足够的信息,以评估您需要做什么和不需要做什么,以及您可以做什么,从而实现您的目标。

SO网友:tfrommen

看来你搞错了Hooks (即。,ActionsFilters) 和Shortcodes.

短代码&mdash在您想要的任何地方执行任务假设您想在网站的某个地方打印特定文本
为此,首先创建function 在您的functions.php, 然后添加个人shortcode 对于这个函数use it anywhere you want. 如果要对页面/帖子执行此操作,只需使用短代码本身(例如。,[my_shortcode]), 而您可以使用do_shortcode(\'my_shortcode\') 在主题的模板文件中或在functions.php.

下面是一个如何使用shortcode:

function wpse85485_shortcode() {
    return "That\'s my new shortcode. <strong>Yay!</strong>";
}
add_shortcode(\'my_shortcode\', \'wpse85485_shortcode\');
行动执行由特定动作触发的任务假设你想激活友好的幽灵:)<同时假设你想让卡斯珀吓唬任何来访者no matter what page 他/她可能会访问
首先,设置function (吓唬游客),然后hook it to a certain appropriate action.

下面是一个如何使用action hook:

function casper_the_friendly_ghost() {
    echo "<script>alert(\'Boo!\');</script>";
}
add_action(\'wp_footer\', \'casper_the_friendly_ghost\');
<小时>References:

结束

相关推荐

Landing Page - Redirect Loop?

为此,最近给出了此解决方案(感谢D先生)Wordpress redirect to landing page if not logged in 线<?php if($_SERVER[\'REQUEST_URI\'] != \'.../\' || $_SERVER[\'REQUEST_URI\'] != \'.../\'){ if(!is_user_logged_in()) { wp_redirect( \'http://www.mysite.com/landingp