为什么我的小部件会破坏其他小部件?

时间:2013-12-21 作者:Matt Kaye

因此,我创建的这个小部件正在杀死在同一提要栏中注册的所有其他小部件。也就是说,在这个小部件完成后,不会呈现任何内容。没有其他小部件标记可以将其添加到DOM中。经过数小时的拉扯,我发现罪魁祸首与\\u get\\u featured\\u posts()中的get\\u posts方法有关。这就像调用该方法停止所有其他小部件处理一样。以下是我的小部件代码:

class Featured_newsroom_posts extends WP_Widget {
function __construct() {
    parent::__construct(
        \'featured_newsroom_posts\', // Base ID
        __(\'CUMC: Featured Newsroom Posts\', \'text_domain\'), // Name
        array( \'description\' => __( \'Featured posts to show on the newsroom homepage ordered by publish date.\', \'text_domain\' ), ) // Args
    );
}

public function widget( $args, $instance ) {
    $title = apply_filters( \'widget_title\', $instance[\'title\'] );
    echo $args[\'before_widget\'];
    if ( ! empty( $title ) ){
        echo $args[\'before_title\'] . $title . $args[\'after_title\'];
    }

    $featured_posts = $this->_get_featured_posts();
    if (!empty($featured_posts)) {
        $count = 1;
        foreach ($featured_posts as $inner) {
            echo \'
                <article class="headline">
                    <a href="\' . $inner->guid . \'">
                        <strong class="headline-source">\' . $inner->post_title . \'</strong>
                    </a>
                </article>\';
            if ($count === (int)$instance[\'count\']) {
                break;
            }
            $count++;
        }
    } else {
        echo \'No recent posts found.\';
    }
    echo $args[\'after_widget\'];
}

public function form( $instance ) {
    if ( isset( $instance[\'title\'] ) ) {
        $title = $instance[\'title\'];
    }
    else {
        $title = __( \'Featured Posts\', \'text_domain\' );
    }
    ?>
    <p>
        <label for="<?php echo $this->get_field_id( \'title\' ); ?>"><?php _e( \'Title:\' ); ?></label> 
        <input class="widefat" id="<?php echo $this->get_field_id( \'title\' ); ?>" name="<?php echo $this->get_field_name( \'title\' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
        <p></p>
        <label for="<?php echo $this->get_field_id( \'count\' ); ?>"><?php _e( \'Number of posts to display:\' ); ?></label>
        <select name="<?php echo $this->get_field_name( \'count\' ); ?>">
            <?php 
                for($i = 1; $i <= 8; $i++){
                    echo \'<option value="\' . $i . \'" \' . ($i === (int)$instance[ \'count\' ] ? \'selected\' : \'\' ) . \'>\' . $i . \'</option>\';
                }
            ?>
        </select>
    </p>
    <?php 
}

public function update( $new_instance, $old_instance ) {
    $instance = array();
    $instance[\'title\'] = ( ! empty( $new_instance[\'title\'] ) ) ? strip_tags( $new_instance[\'title\'] ) : \'\';
    $instance[\'count\'] = $new_instance[\'count\'];

    return $instance;
}

private function _get_featured_posts(){
    global $wpdb;
    //Get all the blog ids
    $sites = wp_get_sites(array(\'public\' => 1, \'offset\' => 1));

    $all_posts = array();
    foreach($sites as $site) {
        switch_to_blog($site[\'blog_id\']);
        //Find posts that are marked for listing in the newsroom
        $posts = get_posts(array(\'meta_key\' => \'list_in_newsroom\', \'meta_value\' => \'1\'));
        if($posts){
            $all_posts = array_merge($all_posts, $posts);
        }
    }
    restore_current_blog();
    return $all_posts;
}
}

function register_custom_widgets() {
register_widget( \'Featured_newsroom_posts\' );
}
add_action( \'widgets_init\', \'register_custom_widgets\' );
任何帮助都会非常棒!谢谢

1 个回复
最合适的回答,由SO网友:user42826 整理而成

我已经看到了一个问题。这是您对switch\\u to\\u blog()的使用。您可能正在执行多个switch\\u to\\u blog()调用;在循环结束时调用restore\\u current\\u blog()一次是没有意义的。请用示例查看法典-http://codex.wordpress.org/Function_Reference/switch_to_blog

快速修复方法是将restore\\u current\\u blog()放入foreach循环中。如果未正确使用switch\\u to\\u blog()和restore\\u current\\u blog(),则会发生以下情况:WP globals会中断,并且可能会中断随后调用的WP API。

结束

相关推荐

Prevent widgets removal

我正在用许多小部件构建一个网站。它们是高度定制的。当站点处于活动状态时,几个管理员/编辑器必须编辑这些小部件。现在,我很害怕看到一个小部件(及其配置)可以在一次鼠标移动中完全擦除(将其从侧栏中删除)。有没有什么方法可以防止小部件被删除,同时保持编辑其内容的能力?此外,在我看来,管理中的widget管理页面为“添加widget”模块提供了太多的空间,而为“激活的widget”模块提供的空间不足。这在创建站点时很有用,但在完成站点时却毫无用处。有没有办法切换这些模块的大小?非常感谢