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

Jef*_*eff 17 wordpress widget filter

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

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

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

add_[FILTER OR ACTION]( 'need_a_hook', 'clean_widget_output', 99 );
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我是PHP的新手,但我可以解决.

Jef*_*eff 8

这是出于需要/渴望清除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;
}
Run Code Online (Sandbox Code Playgroud)

然后echo tidy_sidebar( 'sidebar-name-or-id' );从你的主题打电话.


And*_*ton 8

我有一个类似的问题,在查看Adam Brown的所有WordPress过滤器挂钩列表后,发现我需要的钩子确实存在(widget_title如pxl提到的那样),但是没有钩子来获取所有窗口小部件输出.我想我会详细说明对我有用的解决方案.

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

function parse_html_widget_title( $text ) {
    return str_replace(array('[[', ']]'), array('<', '>'), $text);
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

add_filter/ apply_filter功能会自动将被过滤作为第一个参数指定为过滤器的功能内容,所以这是所有你需要做的.

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