如何通过ADD_ACTION挂钩侧边栏?

时间:2012-07-26 作者:mike

在我的一个模板上,我有一个动作挂钩“do\\u xyz”

我想将自定义侧栏附加到动作挂钩do\\u xyz

下面是我在主题函数中尝试的内容。php文件,不工作:

add_action(\'do_xyz\', \'get_sidebar(\'secondary\')\' );
这样做的正确方式是什么?

我知道我的挂钩设置正确,因为如果我在那里附加一个定制的函数,那么它就会工作。我似乎无法以我尝试的方式附加侧栏。

EDIT我的函数文件中有:

函数do\\u xzy(){do\\u action(\'do\\u xyz\');}

在我的模板中,我有:

do_action( \'do_xyz\' );
我完全理解在我的主题中注册一个动作挂钩,并为动作添加一个发生的位置。

我甚至有些理解add\\u action,只是当我把get\\u边栏(“secondary”)放在那里作为我想要附加到动作挂钩的函数时,我不喜欢它。

希望这更有意义。

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

说明

这是全局数组$wp_filters. 此数组存储一些子数组。每个一个priority. 然后,每个子数组都为添加的每个回调包含一个数组。这些子数组的键是附加的函数。

示例

如果执行以下操作,请在代码中的某个位置(最好在init 挂钩):

echo \'<pre>\';
    var_dump( $GLOBALS[\'wp_filter\'][\'the_content\'] );
echo \'</pre>\';
&hellip;然后您将看到以下内容(答案减少):

array
  11 => 
    array
      \'capital_P_dangit\' => 
        array
          \'function\' => string \'capital_P_dangit\' (length=16)
          \'accepted_args\' => int 1
      \'do_shortcode\' => 
        array
          \'function\' => string \'do_shortcode\' (length=12)
          \'accepted_args\' => int 1
  10 => 
    array
      \'wptexturize\' => 
        array
          \'function\' => string \'wptexturize\' (length=11)
          \'accepted_args\' => int 1
      \'convert_smilies\' => 
        array
          \'function\' => string \'convert_smilies\' (length=15)
          \'accepted_args\' => int 1
      \'convert_chars\' => 
        array
          \'function\' => string \'convert_chars\' (length=13)
          \'accepted_args\' => int 1
      \'wpautop\' => 
        array
          \'function\' => string \'wpautop\' (length=7)
          \'accepted_args\' => int 1
      \'shortcode_unautop\' => 
        array
          \'function\' => string \'shortcode_unautop\' (length=17)
          \'accepted_args\' => int 1
      \'prepend_attachment\' => 
        array
          \'function\' => string \'prepend_attachment\' (length=18)
          \'accepted_args\' => int 1
  8 => 
    array
      \'000000002657b7190000000078ed2c6erun_shortcode\' => 
        array
          \'function\' => 
            array
              ...
          \'accepted_args\' => int 1
      \'000000002657b7190000000078ed2c6eautoembed\' => 
        array
          \'function\' => 
            array
              ...
          \'accepted_args\' => int 1
因此,如果要将以下调用添加到某个模板中:

do_action( \'hook_name\' );
&hellip;然后,附加到此挂钩的每个回调函数都将保存在全局数组中。

// WPSE QuestionNr. Callback Function
function wpse59779_cb_fn()
{
    return print \'I am now added to the template!\';
}
add_action( \'hook_name\', \'wpse59779_cb_fn\' );
这意味着我们从var_dump (属于\'hook_name\'):

array
  10 => 
    array
      \'wpse59779_cb_fn\' => 
        array
          \'function\' => string \'wpse59779_cb_fn\' (length=15)
          \'accepted_args\' => int 1
          ...etc...
发生了什么因此,如果您添加string 通过add_action 到某个钩子,然后基本上是将数据添加到global 大堆

这个do_action( \'hook_name\' ); 然后在全局名称空间中搜索一个函数(在本例中)并执行该函数。

问题是,您试图做很多事情,但实际上并不了解PHP的基础知识。这里有一些注释,但剩下的将是关于您和php的。净值:

add_action( \'do_xyz\', \'get_sidebar(\'secondary\')\' );
这将导致一个失败,因为您在第二次回调后在回调中结束字符串\', 所以secondary 代表其本身,可能会被视为一个常量或只是中断,因为您没有使用., 把事情联系起来。

如何操作

如果要将侧栏(或任何其他元素)添加到挂钩,只需添加一个包装模板标记的回调函数

function wpse59779_get_sidebars()
{
    return get_sidebar( \'secondary\' );
}
add_action( \'do_xyz\', \'wpse59779_get_sidebars\' );
高级钩子可以接受参数,因此您也可以使用默认值:

do_action( \'do_xyz\', \'secondary\' ); 
然后可以使用或修改默认值,例如条件

function wpse59779_get_sidebars( $sidebar_name )
{
    return get_sidebar( $sidebar_name );
}
add_action( \'do_xyz\', \'wpse59779_get_sidebars\' );
带有条件的示例:

function wpse59779_get_sidebars( $sidebar_name )
{
    if ( is_page() )
    {
        $sidebar_name = \'page_sidebar\';
    }
    elseif ( is_post() )
    {
        $sidebar_name = \'single_post_sidebar\';
    }
    return get_sidebar( $sidebar_name );
}
add_action( \'do_xyz\', \'wpse59779_get_sidebars\' );
更高级的钩子可以接受多个参数:

do_action( \'do_xyz\', \'secondary\', \'FFF\' ); 
具有两个参数的示例:

function wpse59779_get_sidebars( $sidebar_name, $color )
{
    echo "<div style=\'background-color: #{$color};\'>Hello!</div>";

    if ( is_page() )
    {
        $sidebar_name = \'page_sidebar\';
    }
    elseif ( is_post() )
    {
        $sidebar_name = \'single_post_sidebar\';
    }
    return get_sidebar( $sidebar_name );
}
add_action( \'do_xyz\', \'wpse59779_get_sidebars\', 10, 2 );
注意,我们现在得到了add_action 呼叫:第一个是priority (默认值为10)何时在挂钩内执行函数,第二个是参数数。仅当参数数大于1时才需要这些参数。

希望这有助于解决问题。

SO网友:mrwweb

get_sidebar( \'secondary\' ); 将加载模板文件sidebar-secondary.php.

你要找的是dynamic_sidebar() 作用您还必须首先使用register_sidebar().

所以你有两个选择。

1) 只需将侧栏放在模板文件中。将其直接置于do_action() 打电话,以有意义的为准:

do_action( \'do_xyz\' );
dynamic_sidebar( \'secondary\' );
2)使用挂钩。

function my_print_sidebar() {
    dynamic_sidebar( \'secondary\' );
}
add_action( \'do_xyz\', \'my_print_sidebar\' );

SO网友:Antony Gibbs

很抱歉,当这应该是一个评论时,将此作为一个答案发布。在一个钩子问题中调用侧栏有一段时间了,我想提一下侧栏ID应该都是小写的。如果您在侧栏ID(例如:“Secondary”)中使用大写字母,则注册的侧栏将显示在wp admin中,您可以向其添加小部件,但如果您不注册侧栏,则关联的小部件将不会显示为“未激活的小部件”。。。它们只是消失了:-/is\\u active\\u侧栏(“Secondary”)将始终返回false动态侧栏(“Secondary”)或get\\u侧栏(“Secondary”)将不返回任何内容。

我正在使用wordpress 4.5.2希望这可以帮助某人:)

祝你今天愉快

结束

相关推荐

Adding content to sidebars

我正在设计一个三栏布局,根据主栏中的帖子/页面,所有三栏都有不同的内容。我如何才能改变和更新侧边栏内容,并使用以下内容在模板中显示它<?php the_content() ?> ? 由于侧边栏内容与帖子相关,我需要一种方法来引用帖子的右侧侧边栏内容。提前感谢诚挚的nav