如何重置此WP查询

时间:2013-06-29 18:42:37

标签: wordpress foreach reset shortcode wpdb

我为Wordpress构建了这个短代码功能,它列出了所有具有特定类别的评论状态的帖子。

我在页面上使用它来在我的博客上做出一些公开讨论的摘要。它可以工作,但在我使用它后,我的wordpress页面的全局wo查询被我的短代码列出的最后一个帖子改变了。

例如,页面底部的“编辑”链接会让我编辑短代码列出的最后一个帖子,而不是我正在使用的页面。

我使用标准的wp_reset_query();修复它的功能,但它不起作用......任何想法?

这是代码:

1)选择comment_status = $ status

的所有帖子
function get_posts_based_on_comment_status($categories, $status='open', $limit=100) {
       global $wpdb;
       $sql = "SELECT * FROM $wpdb->posts
              LEFT JOIN $wpdb->term_relationships
              ON($wpdb->posts.ID=$wpdb->term_relationships.object_id)
              LEFT JOIN $wpdb->term_taxonomy
              ON($wpdb->term_relationships.term_taxonomy_id=$wpdb->term_taxonomy.term_taxonomy_id)
              WHERE $wpdb->term_taxonomy.term_id='$categories'
              AND $wpdb->term_taxonomy.taxonomy='category'
              AND $wpdb->posts.post_status='publish'
              AND $wpdb->posts.comment_status='$status'
              ORDER BY $wpdb->posts.post_date DESC
              LIMIT $limit;";
       $results = $wpdb->get_results($sql);
       if (!empty($results)) return $results;
       else return FALSE;
    }

2)构建循环(最后使用Reset)

function print_posts_based_on_comments($atts) {
        $render = '';
         extract(shortcode_atts(array(
                'cat' => '',
                'title' => '',
                'comment' => 'open',
                'limit' => 10
            ), $atts));
        $render .= '<div class="forum_post_list">';

        if ($cat){      
                $block_title = ($title != '')? $title : get_cat_name( $cat ) ;  
                if ($block_title != 'no'){
                    $render .= '<h3>'.$block_title.'</h3>'; 
                    }
                $posts_c = get_posts_based_on_comment_status($cat, $comment, $limit);
                if ($posts_c) {
                    global $post;
                    $render .= '<ul>';
                    foreach ($posts_c as $post) :
                        setup_postdata($post); 
                        $comment_count = get_comments_number( get_the_ID() ); 
                        $render .= '<li>';
                        $render .= '<h5>';
                        $render .= '<a class="title" href="'. get_permalink().'">'. get_the_title().'</a> ';
                        $render .= '<a class="comments" href="'. get_permalink().'#comment-wrap">'.$comment_count.'<span>Go to Discussion</span></a>';
                        $render .= '</h5>';
                        $render .= '</li>';
                    endforeach;
                    $render .= '</ul>';
                }
        } else{
                $render .= '<h5>'.__('You Must Specify at least one category. Ex: [forum cat=1]', 'smallscalefarming').'</h5>';
        }
        $render .= '</div>';    
        return $render; 
        wp_reset_query();
}

3)对其进行短代码

 add_shortcode('forum', 'print_posts_based_on_comments');  

2 个答案:

答案 0 :(得分:0)

重置函数没有被调用,因为它出现在return语句之后,请尝试将它放在之前:

 wp_reset_query();
 return $render; 

答案 1 :(得分:0)

问题解决了, 在foreach循环结束之前,我的代码中使用的正确函数是wp_reset_postdata();,这是有效的:

function print_posts_based_on_comments($atts) {
        $render = '';
         extract(shortcode_atts(array(
                'cat' => '',
                'title' => '',
                'comment' => 'open',
                'limit' => 10
            ), $atts));
        $render .= '<div class="forum_post_list">';

        if ($cat){      
                $block_title = ($title != '')? $title : get_cat_name( $cat ) ;  
                if ($block_title != 'no'){
                    $render .= '<h3>'.$block_title.'</h3>'; 
                    }
                $posts_c = get_posts_based_on_comment_status($cat, $comment, $limit);
                if ($posts_c) {
                    global $post;
                    $render .= '<ul>';
                    foreach ($posts_c as $post) :
                        setup_postdata($post); 
                        $comment_count = get_comments_number( get_the_ID() ); 
                        $render .= '<li>';
                        $render .= '<h5>';
                        $render .= '<a class="title" href="'. get_permalink().'">'. get_the_title().'</a> ';
                        $render .= '<a class="comments" href="'. get_permalink().'#comment-wrap">'.$comment_count.'<span>Go to Discussion</span></a>';
                        $render .= '</h5>';
                        $render .= '</li>';
                        wp_reset_postdata();
                    endforeach;
                    $render .= '</ul>';
                }
        } else{
                $render .= '<h5>'.__('You Must Specify at least one category. Ex: [forum cat=1]', 'smallscalefarming').'</h5>';
        }
        $render .= '</div>';    
        return $render; 
}