Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在wordpress中按id基获取小部件_Php_Wordpress_Widget_Sidebar - Fatal编程技术网

Php 如何在wordpress中按id基获取小部件

Php 如何在wordpress中按id基获取小部件,php,wordpress,widget,sidebar,Php,Wordpress,Widget,Sidebar,我正在使用一个名为“wordpress页面小部件”的wordpress插件。这个小部件允许我在每页添加小部件,并通过模板中的“动态侧栏”(“侧栏”)显示它们 由于我希望能够完全控制网站上的每个页面,包括归档页面,因此我在页面区域中创建了每个页面实例,包括归档页面所在的页面,并根据页面id加载内容,其中slug名称匹配 function theme_page_id_by_slug(){ global $post; $post_type = $_GET['post_type'] ?

我正在使用一个名为“wordpress页面小部件”的wordpress插件。这个小部件允许我在每页添加小部件,并通过模板中的“动态侧栏”(“侧栏”)显示它们

由于我希望能够完全控制网站上的每个页面,包括归档页面,因此我在页面区域中创建了每个页面实例,包括归档页面所在的页面,并根据页面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_小部件”使用小部件类名作为参数,这并不可靠,因为我遇到的不是每个小部件都以“WP_小部件”开头

我考虑使用“global$wp_widget_factory”列出所有widget,然后根据post_meta过滤结果


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

我修改了我原来的theme_边栏函数,因此它使用了全局$wp_widget_工厂

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;
}

有人能告诉我这是一个有效的解决方案吗。如果有另一个解决方案已经实现了我想要实现的目标,我不想重新发明轮子?