Страница только для виджета регистрации - это единственное число пользовательского типа записи


Я создал пользовательский тип записи с несколькими сопутствующими виджетами, и мне было интересно, можно ли показывать (некоторые из) этих виджетов, только если вы находитесь на определенной странице.

В настоящее время у меня есть

function widget($args, $instance)
{
    global $post;
    $links = unserialize(get_post_meta( $post->ID, 'links', true ));

    if(!is_singular( 'press_articles' ) || $links == false) {
        unregister_widget( 'Point72_Press_Article_Links_Widget' );
        return false;
    }

    // widget stuff
}

Но, похоже, это не полностью удаляет его, и я имею в виду, что он удаляет виджет в нужных местах, но позиции для виджетов остаются, даже если они не пустые.

Итак, есть ли в любом случае возможность либо удалить пустые позиции, либо нет показывать его вообще за пределами пользовательского типа записи?

Author: Hosh Sadiq, 2012-02-22

2 answers

Вместо того, чтобы уничтожать весь виджет, вы должны поместить свои условные операторы в сам виджет:

public function widget( $args, $instance ) {
     if ( is_singular( array( 'post_type_a', 'post_type_b' ) ) ) {
          // display your widget here
     }
}

Поскольку вы не печатаете $before_widget и $after_widget, для этого виджета не будет никаких выходных данных, если не будут выполнены условия.

 1
Author: Brian Fegter, 2012-02-22 16:01:26

Ладно, наконец-то я понял! Не смог бы, не взглянув на источник логики виджета

Вот как это бывает: Сначала зарегистрируйте функцию для фильтрации sidebar_widgets:

add_filter( 'sidebars_widgets', 'my_filter_widgets', 10);

Затем просмотрите все виджеты, пропустите виджеты, которые вас не интересуют, и если ваше условие не выполняется для виджетов, которые вам небезразличны, удалите их, вот так:

function my_filter_widgets($sidebars_widgets)
{
    foreach($sidebars_widgets as $widget_area => $widget_list)
    {
        foreach($widget_list as $pos => $widget_id)
        {
            // We're only after widgets named my_custom_widget, this can vary and you will need to find out, try doing a var_dump() on  $sidebars_widgets
            if(substr($widget_id, 0, 17) != 'my_custom_widget') {
                continue;
            }

            // Those that have not been skipped over, check your condition, and if it doesn't meet the condition, remove it from the $sidebars_widgets array
            if ('press_articles' != get_post_type() || !is_single()) {
                unset($sidebars_widgets[$widget_area][$pos]);
            }
        }
    }
    return $sidebars_widgets;
}
 0
Author: Hosh Sadiq, 2012-02-22 16:50:56