使用$wpdb类在网络上拉取最近的评论

时间:2014-04-17 作者:jw60660

一直在寻找一种使用$wpdb数据库类跨网络生成评论的干净简单的方法。

我确实找到了this answer, 它已经被保护了,已经四年了。

我将它包装在一个函数中,并试图在我的网络首页上调用它,但没有成功。我还使用了mysql语句,但无法让它生成任何输出。

以下是我所拥有的:

function display_sitewide_comments() {

global $wpdb;
$number = 20; // maximum number of comments to display
$selects = array();
$args = array();
foreach (wp_get_sites( $args ) as $blog)
   // select only the fields you need here!
   $selects[] = "(SELECT comment_post_ID, comment_author, comment_author_email, comment_date_gmt, comment_content, post_title, {$blog[\'blog_id\']} as blog_id FROM {$wpdb->base_prefix}{$blog[\'blog_id\']}_comments
      LEFT JOIN {$wpdb->base_prefix}{$blog[\'blog_id\']}_posts
      ON comment_post_id = id
      WHERE post_status = \'publish\'
        AND post_password = \'\'
        AND comment_approved = \'1\'
        AND comment_type = \'\'
       ORDER BY comment_date_gmt DESC LIMIT {$number})"; // real number is (number * # of blogs)

  $comments = $wpdb->get_results(implode(" UNION ALL ", $selects)." ORDER BY comment_date_gmt DESC", OBJECT);

$count = 0;
foreach((array)$comments as $comment):
  $count++;
  if($count == $number+1) break; 
  ?>
  <li>
   <?php echo get_avatar($comment->comment_author_email, 32); ?>
   <a href="<?php echo get_blog_permalink($comment->blog_id, $comment->comment_post_ID); ?>" title="commented on <?php echo strip_tags($comment->post_title); ?>">
   <?php echo $comment->comment_author; ?> wrote: 
   <?php echo convert_smilies(wp_trim_excerpt($comment->comment_content)); ?>
   (<?php echo human_time_diff(strtotime("{$comment->comment_date_gmt}")); ?>)  
   </a>
  </li>
<?php
endforeach;
}
我想知道,既然这篇文章已经发表了4年了,那么是核心还是数据库结构发生了变化,导致查询过时了?或者可能有一个我看不到的错误。在调试模式下,它不会引发任何错误。我还声明并使用了一个空的$args数组,正如在最初的帖子中所建议的那样。

我认为这是一个非常有用的功能,而且比我更多的人在这方面遇到了麻烦。

谢谢

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

为什么不使用get_comments(), 而不是你自己$wpdb?

function display_sitewide_comments() {
    $sites = wp_get_sites();
    $network_comments = array();
    $max = 20;
    foreach( $sites as $site ) {
        switch_to_blog( $site->blog_id );    
        $args = array(
        \'number\' => $max,
            \'status\' => \'approved\',
    );
        $network_comments[$site->blog_id] = get_comments( $args );
        restore_current_blog();
    }
    // inspect the comments
    var_dump( $network_comments );
}

Edited to add:

如果您只想查看最近的20条评论,您可以更改$network_comments[$site->blog_id] = get_comments( $args ); 大概是

$comments = get_comments( $args );
foreach( $comments as $comments ) {
    $network_comments[] = $comment;
}
然后,在循环结束时,使用usort() 根据对注释进行排序的步骤$comment->comment_date_gmt 然后将其截断为$max 价值观

参考文献wp_get_sites()
  • switch_to_blog() &;restore_current_blog()
  • get_comments()
  • 结束

    相关推荐

    使用wpdb->Prepare for`ORDER BY`列名

    在我当前的插件中,我选择order by 列作为用户输入。所以我想用wpdb->prepare 为了逃避它。$wpdb->get_results($wpdb->prepare(\"Select id from $wpdb->posts order by %s %s\", $order_by_col, $order_by); 这不起作用,因为它会变成select id from wp_posts order by \'post_date\' \'asc\' (注意