SYS 棚户区
当前位置:首页 > 分类 > 网络百科 > 文章内容

weisaybox 主题里集成了读者评论排行榜功能,代码就跟露兜即刻这篇文章原理一样,主要使用了 SQL 查询语句来实现核心功能。为了后期维护方便,少接触 SQL 语句,也使得代码更“优雅”一些,我还是想找到使用 WordPress 原生 API 实现功能的版本。

不过没找到。

所以就花了一天时间把这个功能使用 WordPress 原生函数改造了一遍。使用了一段时间貌似还没发现什么问题,所以拿出来分享一下,抛砖引玉,或者共同来发现一些 bug。

贴代码:

<?php
function syshut_commenter_list( $number_commenters, $aftertime ) {
	if ( ! $output = get_option( 'syshut_commenter_list' ) ) {
		global $post;

		$exclude_ids = array();
		$myposts = get_posts(
			array(
				'has_password' => true,
			)
		);
		if ( $myposts ) {
			foreach ( $myposts as $post ) {
				setup_postdata( $post );
				$exclude_ids[] = get_the_ID();
			}
			wp_reset_postdata();
		}

		$comments = get_comments(
			array(
				'author__not_in' => get_the_author_meta( 'ID' ),
				'date_query'     => array(
					'after'  => $aftertime,
					'before' => 'tomorrow',
				),
				'post__not_in'   => $exclude_ids,
				'post_status'    => 'publish',
				'status'         => 'approve',
			)
		);

		$comment_email_group = array();
		foreach ( $comments as $comment ) {
			$comment_author_email = get_comment_author_email( $comment );

			if ( ! isset( $comment_email_group[ $comment_author_email ] ) ) {
				$comment_email_group[ $comment_author_email ] = array(
					'comment_author'     => get_comment_author( $comment ),
					'comment_author_url' => empty( $comment->comment_author_url ) ? '' : get_comment_author_url( $comment ),
					'comment_count'      => 1,
				);
			} else {
				$comment_email_group[ $comment_author_email ]['comment_count']++;
			}
		}

		$comment_email_group = wp_list_sort( $comment_email_group, 'comment_count', 'DESC', true );
		$comment_email_group = array_slice( $comment_email_group, 0, $number_commenters );

		$output = '';
		foreach ( $comment_email_group as $comment_author_email => $comment_meta ) {
			$output .= sprintf(
				'<li><a href="%s" title="%s(留下 %s 个脚印)">%s</a></li>',
				$comment_meta['comment_author_url'],
				$comment_meta['comment_author'],
				$comment_meta['comment_count'],
				get_avatar( $comment_author_email, 40 ),
			);
		}
		add_option( 'syshut_commenter_list', $output );
	}
	echo $output;
}

两个参数:$number_commenters 是要显示的读者头像数量,填写正整数即可,我这里用的 10$aftertime 是起始时间,代表统计某个时间点之后的评论,我这里是统计两年之内的,所以用的 '2 years ago'。第二个参数可用的时间关键字除了 year,还有 monthweekdayhoursecond 等。

跟露兜的代码类似,我也可以排除指定类型的文章,例如代码中的 'has_password' => true, 表示不统计加密文章中的评论,其他排除方式用户可以根据需求自己扩展。'author__not_in' => get_the_author_meta( 'ID' ), 是排除评论者为当前文章作者的情况,当然也可以参照露兜的方式,排除所有的注册用户。避免重复大量查询数据库,上面代码把查询结果写入数据库,下次会直接从库调用。再配合下边这段代码使用:

<?php
function syshut_clear_commenter_list_cache() {
	delete_option( 'syshut_commenter_list' );
}

$work_tags = array(
	'save_post',
	'comment_post',
	'wp_set_comment_status',
);
foreach ( $work_tags as $work_tag ) {
	add_action( $work_tag, 'syshut_clear_commenter_list_cache' );
}

这样,在发布/更新文章发表评论或者评论状态改变时就会清空数据库,并在下次页面被访问时对数据库更新了。把以上两段代码贴到主题目录的 functions.php 中,再在侧边栏或其他打算显示的位置使用 syshut_commenter_list( 10, '2 years ago' ) 调用即可。看下效果:

题外说一句,我这位近十年前在刚开博时对代码一窍不通的门外汉,现在居然也能东拼西凑写出一个完整的功能,不得不说 WordPress 强大无比,这也让我觉得自己还挺有成就感的。

本页链接:https://www.syshut.com/commenter-list-with-wp-api.html
版权声明:除特殊注明均为原创文章,转载请保留出处!

微信扫一扫,打赏作者吧~

支付宝扫一扫,打赏作者吧~

  • 【较新一篇】已是最新文章
  • 【较旧一篇】

评论总数:12,访客评论:7,作者评论:5

    • sys

      @纬八路 自己动手确实是乐趣之一

      回复
  1. 不行了,放以前一定会一头扎进去,研究个没日没夜。现在,看这些总会感觉头晕 哈哈

    回复
      • @sys 练字每天40-60分钟即可,代码这玩意如果钻进去,我怕得整宿整宿了 :cry:

        回复
  2. :cool: 现在我是不研究了,能用就用,用不了就换。

    回复
    • sys

      @灰常记忆 随性点好,博客有内容输出就行,我们不是开发者很多问题不必深究了 :razz:

      回复
  3. 哈哈,时间久了,无师自通^_^

    回复
    • sys

      @ieu 时间是最好的老师 :idea:

      回复
    • sys

      @禹步网 需要一双发现美好的眼睛 :idea:

      回复

发表评论

提交快捷键 Ctrl + Enter,清空后内容不可恢复