我试图通过一个简单的过滤器过滤所有小部件输出,但找不到任何钩子,并希望指向正确的方向。或者可能我的努力甚至不可能?
我的简单过滤器是这样的:
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的新手,但我可以解决。
答案 0 :(得分:7)
这是出于需要/渴望清除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' );
。
答案 1 :(得分:7)
我遇到了类似的问题,在查看了Adam Brown的list of all WordPress filter hooks之后,发现我需要的钩子确实存在(widget_title
,如pxl提到的那样),但是没有钩子来获取所有小部件输出。我以为我会详细说明对我有用的解决方案。
理论上,widget_title
挂钩应该影响你博客上的所有小部件,但我确定某些第三方小部件忽略了包含必要的代码行来应用任何标题过滤器,所以它不是万无一失的。然而,它适用于我,它可用于将自定义的“短代码”(更准确地说,在这种情况下,“长代码”)或语法应用于您的小部件标题。例如,我想偶尔在我的小部件标题中包含html代码,但默认情况下,所有html都被删除。因此,为了能够将<em>
标记之类的内容添加到某些标题中的文字中,我选择了自定义语法:[[
而不是<
&amp; ]]
代替>
(例如[[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
功能会自动将作为第一个参数过滤的内容传递给指定为过滤器的函数,这就是您需要做的所有事情。
为了对窗口小部件的主输出执行类似的操作,您需要查看所有窗口小部件以查看它们使用的钩子并验证它们的主输出是否有过滤器,而不是使用{{1}对于您使用自定义回调函数找到的每个钩子(例如,文本小部件输出为add_filter()
,搜索表单为widget_text
[您可以在wp-includes / general-template中看到它.php,在get_search_form
函数])。问题是一些动态生成的小部件没有钩子(比如Meta小部件),这就是为什么Jeff提供的输出缓冲解决方案是最通用的,虽然不是理想的解决方案。
答案 2 :(得分:4)
有许多未记录的wordpress小部件的钩子。 wordpress codex没有列出它们,无论出于何种原因(例如这些钩子将来可能会发生变化,并且会因新的更新和版本而意外中断)......所以请谨慎使用它们。
要了解它们是什么,至少有两个地方可以看:
<wordpress install directory>/wp-includes/default-filters.php
<wordpress install directory>/wp-includes/default-widgets.php
这两个文件中包含的是所有钩子wordpress使用的很好的列表。
一个例子是小部件的过滤器是widget_title
答案 3 :(得分:2)
我不确定他们什么时候引入了widget_text过滤器,也许他们在09年最初被问到这个问题时没有它,但是因为它现在在那里,并且为了任何人获得这样的stackoverflow就像我从谷歌那里得到的只是恰好阅读得足以看到这个答案,现在实际上非常简单:
function my_widget_filter( $content )
{
// manipulate $content as you see fit
return $content;
}
add_filter( 'widget_text', 'my_widget_filter', 99 );
答案 4 :(得分:0)