Как получить виджеты по базе идентификаторов в WordPress

Я использую плагин 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.

Кто-нибудь может указать мне правильное направление?

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;
}
Другие вопросы по тегам