在WordPress中使用AFTER_TITLE参数的唯一ID设置小部件

时间:2012-05-15 作者:amy

我尝试获取可折叠小部件区域插件,以便它在可折叠区域内创建的每个小部件都有一个唯一的id<div> 在其标题之后。

function get_args() {
    $this->args = apply_filters( \'collapsible-widget-area-args\', array(
        \'name\'          => __( \'Collapsible Widget Area\', \'collapsible-widget-area\' ),
        \'id\'            => \'collapsible-widget-area\',
        \'description\'   => __( \'Drag widgets into this area in order to use them inside of the Collapsible Widget.\', \'collapsible-widget-area\' ),
        \'before_widget\' => \'<div id="%1$s" class="widget %2$s collapsible-item">\',
        \'after_widget\'  => \'</div>\',
        \'before_title\'  => \'<h2 class="widgettitle">\',
        \'after_title\'   => \'</h2><div id="i_want_to_be_a_unique_id_for_every_widget_but_i_am_not"></div>\',
    ) );
    $this->sidebar_id = $this->args[\'id\'];
    if ( ! class_exists( \'collapsible_widget\' ) ) {
        require_once( \'class.collapsible-widget.php\' );
    }
    add_action( \'widgets_init\', array( $this, \'register_widget\' ) );
}
这是设置参数的函数,但据我所知,它只被调用一次,参数适用于每个小部件。有人能告诉我现在使用seomthing像%1$s 对于before_widget 或者更好的是,在after_title?

整个插件可在以下位置查看:in the wordpress plugin svn, 我在上面穿的鞋的功能是class.collapsible-widget-area.php 到目前为止,我唯一补充的是<div id="i_want_to_be_a_unique_id_for_every_widget_but_i_am_not"></div>.

这不是一个“给我写一个程序”的问题,这只是我举的一个例子。也许需要一个完整的其他解决方案来实现这一点,或者使用这个插件很容易做到,因为它已经扩展了wordpress小部件类,我不知道。

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

正在查看widget.php in trac sprintf() 仅运行before_widget (第884行):

$params[0][\'before_widget\'] = sprintf($params[0][\'before_widget\'], $id, $classname_);
因此,它对任何其他参数都不起作用。

我想知道你是否可以使用dynamic_sidebar_params 筛选器,但$id和$classname\\u8参数不会传递给筛选器。除了hacking core之外,我不确定除了修改Twitter引导程序或在页面加载后使用jQuery添加ID之外,你还能做什么。

SO网友:Luuk Skeur

9年后,在一场大流行中,我找到了使用@mrwweb过滤器的方法,并用Wordpress小部件创建了一个运行良好的引导程序(4)崩溃:

因为dynamic_sidebar_params 确实包含唯一的参数(例如ID),您可以使用它向创建的每个小部件添加自定义折叠ID。请参见:https://developer.wordpress.org/reference/hooks/dynamic_sidebar_params/

工作示例:

add_filter(\'dynamic_sidebar_params\', function($params) {
    $params[0][\'after_title\'] = sprintf( $params[0][\'after_title\'], $params[0][\'widget_id\'] );
    $params[0][\'before_title\'] = sprintf( $params[0][\'before_title\'], $params[0][\'widget_id\'] );
    return $params;
}, 10, 1);
现在我添加了$params[0][\'widget_id\']%1$s 但您可以轻松创建更多。阅读有关如何操作的文档sprintf 工程:https://www.php.net/manual/en/function.sprintf.php

因此,使用这些设置创建侧栏将使其中的每个小部件都可折叠。

$config = [
    \'before_widget\' => \'<section class="widget mb-4 %1$s %2$s">\',
    \'after_widget\'  => \'</div></section>\',
    \'before_title\'  => \'<a data-toggle="collapse" href="#%1$s" role="button" aria-expanded="false" aria-controls="%1$s"><h5>\',
    \'after_title\'   => \'</h5></a><div id="%1$s" class="collapse">\'
];
register_sidebar([
    \'name\'          => __(\'Footer col 1\', \'textdomain\'),
    \'id\'            => \'footer-col-1\'
] + $config);
请注意,我将标题<a><h5> 另外,我通过在after_title 然后在after_widget. 这样,标题将起到折叠切换的作用。

如果要使用过滤器而不是创建自己的侧栏,可以按如下方式过滤小部件参数(对于此SO问题):

add_filter(\'collapsible-widget-area-args\', function($args) {
    $args[\'after_title\'] = \'</h5></a><div id="%1$s" class="collapse">\';
    // here the other args for before_title, after_widget eq.
    return $args;
}, 10, 1);

结束

相关推荐

使用PHP要求主题目录中的函数中有文件

我正在尝试从我当前的主题文件夹中动态获取facebook php sdk。我在我的函数中写下了这一点。php,但我所有的尝试都破坏了网站。请看下面我的尝试。。。require template_url(\'/\') . \'facebook-php-sdk-6c82b3f/src/facebook.php\'; require get_bloginfo(\'template_url\') . \'facebook-php-sdk-6c82b3f/src/facebook.php\';&#