我正在使用一个名为" wordpress Page Widgets"的wordpress插件。这个小部件允许我在每个页面添加小部件,并在我的模板中通过"dynamic_sidebar('sidebar')"显示它们。
因为我想完全控制我的网站上的每一页,包括存档页面,我已经在页面区域创建了每个页面实例,包括存档页面将坐的页面,只是通过页面id加载内容,其中鼻涕条名称匹配。
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 Page Widgets"插件将小部件id基存储在post_meta中,这很好,但是"the_widget"使用小部件类名称作为参数,这是不可靠的,因为不是我遇到的每个小部件都以"WP_Widget_"开头。
我想到使用"全局$wp_widget_factory"列出所有小部件,然后根据post_meta过滤结果。
谁能给我指个正确的方向?我已经修改了原来的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;
}