是否存在 WordPress 小部件(或侧边栏)挂钩?

Posted

技术标签:

【中文标题】是否存在 WordPress 小部件(或侧边栏)挂钩?【英文标题】:Do WordPress widget (or sidebar) hooks exist? 【发布时间】:2010-11-26 00:52:53 【问题描述】:

我正在尝试通过一个简单的过滤器过滤所有小部件输出,但找不到任何挂钩,并希望指向正确的方向。或者我的努力甚至不可能?

我的简单过滤器是这样的:

function clean_widget_output( $input ) 
    return str_replace( array( "\t", "\n", "\r" ), '', $input );


add_[FILTER OR ACTION]( 'need_a_hook', 'clean_widget_output', 99 );

有什么想法吗?我对 php 很陌生,但我可以解决。

【问题讨论】:

我不确定他们何时引入了 widget_text 过滤器,也许他们在 09 年最初提出这个问题时没有它。请在我的答案中查看下面的示例代码以获取完整(并且非常简单)的工作示例。 【参考方案1】:

这是出于清除 WordPress 小部件所喷出的可怕 html 的需要/愿望。我喜欢他们所做的事情,但有些输出让我哭了。

简短的回答是output buffering,因为我找不到任何小部件或侧边栏挂钩。

长答案是:

function tidy_sidebar( $sidebar_name_or_id )

    ob_start();

    $bool = dynamic_sidebar( $sidebar_name_or_id);

    if ( $bool )
    
        $str = ob_get_contents();
        $str = 'do cleanup stuff...';
    
    else
    
        $str = '';
    
    ob_end_clean();

    return $str;

然后从您的主题中调用echo tidy_sidebar( 'sidebar-name-or-id' );

【讨论】:

您现在可以在注册侧边栏时控制小部件包装器和小部件标题 html,因此不确定需要多少。如果你不喜欢一个小部件,最好用你喜欢的输出重写它。看看小部件 API (codex.wordpress.org/Widgets_API) 和 register_sidebar 函数 (codex.wordpress.org/Function_Reference/register_sidebar)【参考方案2】:

我遇到了类似的问题,在查看了 Adam Brown 的 list of all WordPress filter hooks 之后,发现我需要的钩子确实存在(widget_title,正如 pxl 提到的那样),但是没有钩子可以获取所有小部件输出。我想我会详细说明对我有用的解决方案。

理论上,widget_title 钩子应该会影响您博客上的所有小部件,但我敢肯定,一些第 3 方小部件忽略了包含应用任何标题过滤器所需的代码行,因此它不是万无一失的。但是,它对我有用,它可用于将自定义“短代码”(更准确地说,在本例中为“长代码”)或语法应用于您的小部件标题。例如,我想偶尔在我的小部件标题中包含 html 代码,但默认情况下,所有 html 都会被删除。因此,为了能够在我的某些标题中的文本中添加 <em> 标签之类的内容,我选择了自定义语法:[[ 而不是 <]] 而不是 >(例如, [[em]][[/em]]) 然后在我的主题的 functions.php 文件中创建一个函数来处理该自定义语法并将其替换为 html 等效项:

function parse_html_widget_title( $text ) 
    return str_replace(array('[[', ']]'), array('<', '>'), $text);

然后我在它下面添加了一行,将函数添加为过滤器:

add_filter('widget_title', 'parse_html_widget_title', 11); // 11 is one above the default priority of 10, meaning it will occur after any other default widget_title filters

add_filter / apply_filter 功能会自动将要过滤的内容作为第一个参数传递给指定为过滤器的函数,这就是您需要做的所有事情。

为了对小部件的主输出执行类似的操作,您需要查看所有小部件以查看它们使用的钩子并验证它们的主输出是否有过滤器,而不是使用add_filter()您使用自定义回调函数找到的每个钩子(例如,对于 Text 小部件输出,它是 widget_text,对于搜索表单,它是 get_search_form [您可以在 wp-includes/general-template.php 中看到它,在 @ 987654338@函数])。问题是一些动态生成的小部件没有钩子(如 Meta 小部件),这就是为什么 Jeff 提供的输出缓冲解决方案是最通用但不理想的解决方案。

【讨论】:

谢谢!!多年来,我一直在寻找这样的东西——你是救生员。 :)【参考方案3】:

wordpress 小部件有很多没有记录的钩子。无论出于何种原因,wordpress 法典都没有列出它们(例如这些钩子将来可能会发生变化,并且会随着新的更新和版本而意外中断)......所以使用它们时要格外小心。

要找出它们是什么,至少有 2 个地方可以查看:

<wordpress install directory>/wp-includes/default-filters.php
<wordpress install directory>/wp-includes/default-widgets.php

包含在这两个文件中的是 wordpress 使用的所有钩子的一个很好的列表。

一个例子是小部件的过滤器是widget_title

再次提醒,请谨慎使用它们,不能保证它们在您正在查看的代码的特定版本之后也能正常工作。

【讨论】:

【参考方案4】:

我不确定他们何时引入了 widget_text 过滤器,也许他们在 09 年最初提出这个问题时没有它,但既然它现在就在那里,而且为了任何像我一样得到这个 *** 的人从谷歌做的,只是碰巧读到足够远才能看到这个答案,现在它实际上很简单:

function my_widget_filter( $content )

    // manipulate $content as you see fit
    return $content;


add_filter( 'widget_text', 'my_widget_filter', 99 );

【讨论】:

这不适用于媒体小部件,例如图片小部件【参考方案5】:

也可以查看dynamic_sidebar_params filter --

Another link --

【讨论】:

以上是关于是否存在 WordPress 小部件(或侧边栏)挂钩?的主要内容,如果未能解决你的问题,请参考以下文章

PHP wordpress |禁用页面模板上的侧边栏,小部件

php 在主题激活期间,WordPress将小部件添加到侧边栏。

Wordpress:如何仅将 widget_title 过滤器应用于某个侧边栏中的小部件?

Wordpress小部件正在管理区域中消失

wordpress侧边栏小工具判断函数is_active_sidebar()

如何将类添加到侧边栏小部件的 <ul> 和子级 <li> - Wordpress