Страница только для виджета регистрации - это единственное число пользовательского типа записи
Я создал пользовательский тип записи с несколькими сопутствующими виджетами, и мне было интересно, можно ли показывать (некоторые из) этих виджетов, только если вы находитесь на определенной странице.
В настоящее время у меня есть
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
}
Но, похоже, это не полностью удаляет его, и я имею в виду, что он удаляет виджет в нужных местах, но позиции для виджетов остаются, даже если они не пустые.
Итак, есть ли в любом случае возможность либо удалить пустые позиции, либо нет показывать его вообще за пределами пользовательского типа записи?
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
, для этого виджета не будет никаких выходных данных, если не будут выполнены условия.
Ладно, наконец-то я понял! Не смог бы, не взглянув на источник логики виджета
Вот как это бывает:
Сначала зарегистрируйте функцию для фильтрации 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;
}