【问题标题】:how to get widgets by id base in wordpress如何在wordpress中通过id base获取小部件
【发布时间】:2015-06-07 11:11:35
【问题描述】:

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

因为我想完全控制我网站上的每个页面,包括存档页面,我已经在页面区域中创建了每个页面实例,包括存档页面所在的页面,并且只通过页面 id 加载内容slug 名称匹配。

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 过滤结果。

谁能指出我正确的方向?

【问题讨论】:

    标签: php wordpress widget sidebar


    【解决方案1】:

    我已经修改了我原来的 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;
    }
    

    【讨论】:

    • 有人可以告诉我这是否是一个有效的解决方案。如果有另一种解决方案已经可以实现我想要实现的目标,我不想重新发明轮子?
    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2016-06-17
    • 2017-11-26
    相关资源
    最近更新 更多