提问人:Jeff 提问时间:9/6/2009 最后编辑:Grant HutchinsonJeff 更新时间:3/31/2014 访问量:21284
WordPress小部件(或侧边栏)钩子是否存在?
Do WordPress widget (or sidebar) hooks exist?
问:
我正在尝试通过一个简单的过滤器过滤所有小部件输出,但找不到任何钩子,希望指向正确的方向。或者我的努力甚至是不可能的?
我的简单过滤器是这样的:
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很陌生,但我可以四处走动。
答:
这是出于清理 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' );
评论
也可以查看dynamic_sidebar_params过滤器 --
另一个链接 --
有很多没有记录的 WordPress 小部件的钩子。wordpress codex 没有列出它们,无论出于何种原因(例如这些钩子将来可能会更改,并且会随着新的更新和版本而意外中断)......因此,请格外小心地使用它们。
要找出它们是什么,至少有 2 个地方可以查看:
<wordpress install directory>/wp-includes/default-filters.php
<wordpress install directory>/wp-includes/default-widgets.php
这两个文件中包含的是 WordPress 使用的所有钩子的一个很好的列表。
例如,小部件的过滤器是widget_title
同样,请谨慎使用它们,它们不能保证在您正在查看的特定代码版本之后工作。
我遇到了类似的问题,在浏览了 Adam Brown 的所有 WordPress 过滤器钩子列表后,发现我需要的钩子确实存在(正如 pxl 所提到的),但没有钩子来获取所有小部件输出。我想我会详细说明对我有用的解决方案。widget_title
从理论上讲,钩子应该会影响您博客上的所有小部件,但我敢肯定一些第三方小部件忽略了包含应用任何标题过滤器所需的代码行,因此它不是万无一失的。然而,它对我有用,它可以用来将自定义的“短代码”(更准确地说,在本例中为“长代码”)或语法应用于您的小部件标题。例如,我想偶尔在我的小部件标题中包含 html 代码,但默认情况下,所有 html 都被剥离了。因此,为了能够在我的一些标题中为文本添加标签之类的东西,我选择了一种自定义语法:而不是 & 而不是(例如,和),然后在我的主题的 functions.php 文件中创建一个函数来处理该自定义语法并将其替换为等效的 html:widget_title
<em>
[[
<
]]
>
[[em]]
[[/em]]
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
为了对小部件的主输出执行类似操作,您需要查看所有小部件,看看它们使用什么钩子,并验证它们是否具有用于其主输出的过滤器,而不是用于使用自定义回调函数找到的每个钩子(例如,它用于文本小部件输出, 或对于搜索表单[您可以在 wp-includes/general-template.php 中看到它,在函数中])。问题在于,一些动态生成的小部件没有钩子(如 Meta 小部件),这就是为什么 Jeff 提供的输出缓冲解决方案是最通用的解决方案,尽管不是理想的解决方案。add_filter()
widget_text
get_search_form
get_search_form()
评论
I'm not sure when they introduced the widget_text filter, maybe they didn't have it in '09 when this question was originally asked, but since it's there now, and for the sake of anyone that gets this stackoverflow like I did from google and just happens to read far enough down to see this answer, it's now actually quite simple:
function my_widget_filter( $content )
{
// manipulate $content as you see fit
return $content;
}
add_filter( 'widget_text', 'my_widget_filter', 99 );
评论