为主题创建多个挂钩

时间:2017-01-18 作者:LWS-Mo

我现在正在研究一个主题,我还想在某些位置添加一些自定义挂钩,以实现更大的灵活性。

我想为主题添加多个挂钩。我有不同的部分(页眉、内容、侧边栏、页脚等),在所有这些位置上,我想添加一个before, insideafter

因此,起初我使用这样的代码块为我的主题创建多个挂钩:

/* Teaser hooks */
function _s_before_teaser() { do_action(\'_s_before_teaser\', \'teaser\'); }
function _s_inside_teaser() { do_action(\'_s_inside_teaser\', \'teaser\'); }
function _s_after_teaser() { do_action(\'_s_after_teaser\', \'teaser\'); }

/* Header hooks */
function _s_before_header() { do_action(\'_s_before_header\', \'header\'); }
function _s_inside_header() { do_action(\'_s_inside_header\', \'header\'); }
function _s_after_header() { do_action(\'_s_after_header\',\'header\'); }

......

/* Sidebar hooks */
function _s_before_sidebar() { do_action(\'_s_before_sidebar\', \'sidebar\'); }
function _s_inside_sidebar() { do_action(\'_s_inside_sidebar\', \'sidebar\'); }
function _s_after_sidebar() { do_action(\'_s_after_sidebar\', \'sidebar\'); }

/* Footer hooks */
function _s_before_footer() { do_action(\'_s_before_footer\', \'footer\'); }
function _s_inside_footer() { do_action(\'_s_inside_footer\', \'footer\'); }
function _s_after_footer() { do_action(\'_s_after_footer\', \'footer\'); }
有了这个代码,我可以使用<?php _s_before_header(); ?> 在模板文件中。

使用此设置,一切正常。

But I find the code, or at least the big code block ugly and also dont want to use duplicate(kinda) code.

因此,我将此代码改写为以下代码块:

function _s_create_all_hooks() {
    $sections = array(
        \'header\',
        \'branding\',
        \'navigation\',
        \'content\',
        \'single\',
        \'sidebar\',
        \'footer\'
    );

    foreach ($sections as $section) {
        do_action(\'_s_before_\'.$section, $section);
        do_action(\'_s_inside_\'.$section, $section);
        do_action(\'_s_after_\'.$section, $section);
    }
}
add_action(\'wp_loaded\', \'_s_create_all_hooks\', 10, 1 );
这也是可行的,但是。。。

用这种方法我无法使用<?php _s_before_header(); ?> 再也没有了,因为我再也没有任何功能了。

相反,我现在必须在模板中使用它<?php do_action(\'_s_before_header\', \'header\'); ?>

但我对这种方法并不感到兴奋,我还发现do_action 我的模板中的代码片段很难看。

我已经在网上搜索过了,找到了几个钩子教程,但在所有教程和文章中只创建了一个钩子示例。没有一篇文章涉及同时创建多个挂钩。

My question is, what is the best practice to create multiple hooks at once?

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

你所做的是do_action 使用单个参数。

File: wp-includes/plugin.php
417:  * @param string $tag     The name of the action to be executed.
418:  * @param mixed  $arg,... Optional. Additional arguments which are passed on to the
419:  *                        functions hooked to the action. Default empty.
420:  */
421: function do_action($tag, $arg = \'\') {
由于PHP是一种自由语言,您还可以向do_action 然后使用te中的参数数量add_action 第4个参数。

function _hookgenerator( $name ) { do_action($name); }
请随意测试,因为这是您可以使其工作的方式。在这个例子中,我根本没有使用钩子参数。也许经过一些思考,你也不需要这样。

相关推荐

Hooks are not executing

根据我对钩子的理解,您可以通过do\\u action(“hook\\u name”)创建一个钩子;然后向所述钩子中添加一些内容,并在希望它执行钩子的位置调用该方法,因此:public function hook_name(){ do_action(\'hook_name\'); } 有些地方你会做类似的事情:add_action(\'hook_name\', \'some_hook\'); 然后在主题中的一些地方,你称之为:hook_name();