如何在wordpress中通过id base获取小部件

时间:2015-06-07 11:11:35

标签: php wordpress widget sidebar

我正在使用一个名为“Wordpress Page Widgets”的wordpress插件。这个小部件允许我每页添加小部件并通过我的模板中的“dynamic_sidebar('sidebar')”显示它们。

因为我想完全控制我网站上的每个页面,包括存档页面,我已经在页面区域创建了每个页面实例,包括存档页面所在的页面,只需按页面ID加载内容slu names名称匹配。

function theme_page_id_by_slug(){
    global $post;
    $post_type = $_GET['post_type'] ? $_GET['post_type'] : get_post_type($post->ID);
    $post = get_post(get_page_by_path(str_replace(get_home_url().'/','',get_post_type_archive_link($post_type))));
    return $post;
}

这种方法几乎适用于我可以通过页面ID实际获取内容或post_meta的所有实例。但是侧边栏不接受任何页面ID参数。因此我必须编写一个函数,以便它可以按页面ID显示小部件。

function theme_sidebar(){
    $post = theme_page_id_by_slug();
    $sidebar = get_post_meta($post->ID, '_sidebars_widgets', true);

    foreach($sidebar['sidebar'] as $k => $v){
        $v = explode('-',$v);
        array_pop($v);
        foreach($v as $k2 => $v2){
            the_widget('WP_Widget_'.ucfirst($v2));
        }
    }
}

“Wordpress页面小部件”插件将小部件ID基础存储在post_meta中,这很好,但“the_widget”使用小部件类名作为参数,这是不可靠的,因为并非我遇到的每个小部件都以“WP_Widget _”。

我想使用“global $ wp_widget_factory”列出所有小部件,然后根据post_meta过滤结果。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

我修改了我原来的theme_sidebar函数,所以它使用全局$ wp_widget_factory

function theme_sidebar(){
    global $wp_widget_factory;

    foreach($wp_widget_factory->widgets as $k => $v){
        $widgets[$v->id_base] = $k;
    }

    if(is_single()){
        global $post;
    }else{
        $post = theme_page_id_by_slug();
    }

    $sidebar = get_post_meta($post->ID, '_sidebars_widgets', true);

    foreach($sidebar['sidebar'] as $k => $v){
        $v = explode('-',$v);
        array_pop($v);
        $v = implode('-',$v);
        if(isset($widgets[$v])){
            the_widget($widgets[$v]);
        }
    }
}

function theme_page_id_by_slug(){
    global $post;
    $post_type = $_GET['post_type'] ? $_GET['post_type'] : get_post_type($post->ID);
    $url = str_replace(get_home_url().'/','',get_post_type_archive_link($post_type));
    $page = get_post(get_page_by_path($url));
    return $page;
}