如何根据WordPress的ID获取WordPress中的Widget内容?

时间:2017-02-19 作者:Lucas Bustamante

我需要根据widget的ID解析它的内容。

但是一个小部件的工作方式就像一个函数,它根据它的参数提取数据,对吗?因此,当我提取小部件数据时,我只能得到它的参数,而不能得到实际的输出。

如何根据widget的ID解析它的内容?

示例代码:

// Update widget rounds automatically
function automatize_games_rounds($instance, $widget, $args){
    // Check if there is a caption
    if (isset($instance[\'caption\']) && !empty($instance[\'caption\'])) {
        // If there is, does it contain the word "round"?
        if (strpos(strtolower($instance[\'caption\']), \'round\')) {
            // If yes, it\'s the kind of widget I\'m looking for. Let\'s get it\'s ID.
            $id = $args[\'widget_id\'];
            // Now I need to parse the widget output to do some stuff based on it\'s content, but how can I get the widget output?
        }
    }
    return $instance;
}
add_filter(\'widget_display_callback\',\'automatize_games_rounds\',10,3);

2 个回复
SO网友:David Lee

如果有参数,可以使用the_widget() 输出您正在搜索的同一小部件。

若您并没有参数或者它们以某种方式发生了变化(虽然可以从数据库中获取),那个么您需要迭代所有小部件区域和每个小部件中的所有小部件,以匹配您正在搜索的ID,并使用the_widget().

SO网友:CodeMascot

实际上,通过这种方式,您无法过滤每个小部件数据。WordPress不提供任何本机方法来过滤任何小部件的最终输出。但是还有其他方法可以修改任何小部件内容-

1. Modify the widget’s source files.

显然,这不是一个好方法,因为如果WordPress或创建小部件的插件更新,您的修改将丢失。

2. Copy the widget into your own plugin or theme and modify it there.

3. Replace the widget’s original display callback function with a custom function, which then runs the original display callback function, but with filters.

基本上,小部件的原始显示回调函数被一个新的自定义函数覆盖,该函数运行小部件的原始回调函数,但使用输出缓冲来捕获输出,并在显示之前通过过滤器运行它。我明白了here 下面是可以在主题或插件中使用的代码,它将提供widget_output 过滤器,以及小部件类型和唯一小部件ID作为参数:

首先,我们需要用自己的自定义函数替换小部件原来的显示回调函数:

function the_dramatist_filter_dynamic_sidebar_params( $sidebar_params ) {

    if ( is_admin() ) {
        return $sidebar_params;
    }

    global $wp_registered_widgets;
    $widget_id = $sidebar_params[0][\'widget_id\'];

    $wp_registered_widgets[ $widget_id ][\'original_callback\'] = $wp_registered_widgets[ $widget_id ][\'callback\'];
    $wp_registered_widgets[ $widget_id ][\'callback\'] = \'the_dramatist_custom_widget_callback_function\';

    return $sidebar_params;

}
add_filter( \'dynamic_sidebar_params\', \'the_dramatist_filter_dynamic_sidebar_params\' );
接下来,我们需要创建前面代码块中引用的函数,该函数将依次运行小部件的原始显示回调函数,但将使用PHP输出缓冲捕获其输出。然后widget_output 过滤器将在小部件生成的HTML标记上运行,然后输出到页面:

function the_dramatist_custom_widget_callback_function() {

    global $wp_registered_widgets;
    $original_callback_params = func_get_args();
    $widget_id = $original_callback_params[0][\'widget_id\'];

    $original_callback = $wp_registered_widgets[ $widget_id ][\'original_callback\'];
    $wp_registered_widgets[ $widget_id ][\'callback\'] = $original_callback;

    $widget_id_base = $wp_registered_widgets[ $widget_id ][\'callback\'][0]->id_base;

    if ( is_callable( $original_callback ) ) {

        ob_start();
        call_user_func_array( $original_callback, $original_callback_params );
        $widget_output = ob_get_clean();

        echo apply_filters( \'widget_output\', $widget_output, $widget_id_base, $widget_id );

    }

}
有了它,您可以在插件或主题中执行类似操作,以修改任何小部件的输出:

function the_dramatist_widget_output_filter( $widget_output, $widget_id_base, $widget_id ) {

    /* To target a specific widget ID: */
    if ( \'target_widget_id\' == $widget_id ) {
        // Apply your desired search and replace operations here
    }

    return $widget_output;

}
add_filter( \'widget_output\', \'the_dramatist_widget_output_filter\', 10, 3 );
希望以上帮助。

相关推荐

在短码中加载带有ID的自定义帖子类型

我第一次提出了一个主题。我为横幅/行动调用创建了一个自定义的帖子类型,我想在不同的帖子中使用一个快捷码来包含这些横幅/行动调用。短代码应如下所示:[banner id=123].到目前为止,所有的横幅都会显示出来,我的快捷码参数不会过滤结果。我的失败在哪里? function mrt_shortcode_banner( $atts ) { // Attributes $atts = shortcode_atts( array(