仅注册小部件页面是自定义帖子类型的单数

时间:2012-02-22 作者:Hosh Sadiq

我已经创建了一个自定义的帖子类型,附带了一些小部件,我想知道是否只有在特定页面上才能显示(其中一些)这些小部件。

目前我有

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 个回复
最合适的回答,由SO网友:Hosh Sadiq 整理而成

好了,我终于明白了!如果不看看Widget Logic

它是这样的:首先注册一个要过滤的函数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;
}

SO网友:Brian Fegter

您应该将条件语句放在小部件本身中,而不是对整个小部件进行nuking:

public function widget( $args, $instance ) {
     if ( is_singular( array( \'post_type_a\', \'post_type_b\' ) ) ) {
          // display your widget here
     }
}
既然你没有打印$before_widget$after_widget, 除非满足条件,否则此小部件不会有任何输出。

结束

相关推荐

Problem with widgets

我使用的主题是3灰色。它已启用小部件。主题中很少有硬编码的小部件。这些小部件不会出现在小部件页面的侧栏中。如果我尝试添加新的小部件,旧的小部件会被删除。这是正常情况吗。或者这里有什么问题吗。