Я использую плагин WordPress под названием «WordPress Widgets». этот виджет позволяет мне добавлять виджеты на страницу и отображать их через «dynamic_sidebar (‘sidebar’)» в моих шаблонах.
так как я хотел бы иметь полный контроль над каждой страницей на моем веб-сайте, включая страницы архива, я создал каждый экземпляр страницы в области страниц, включая страницу, на которой будет расположена страница архива, и просто загружаю контент по идентификатору страницы, где находится имя слаг Матчи.
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;
}
этот подход сработал почти для всех случаев, когда я могу получить контент или post_meta через идентификатор страницы. однако боковая панель не принимает никаких параметров идентификатора страницы. поэтому мне приходится писать функцию, чтобы она могла отображать виджеты по идентификатору страницы.
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» сохраняет базу идентификаторов виджетов в post_meta, что нормально, но «the_widget» использует имя класса виджета в качестве параметра, который не является надежным, поскольку не каждый виджет, с которым я сталкивался, начинается с «WP_Widget_» ,
я подумал об использовании «global $ 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;
}
Других решений пока нет …