如何使用点赞插件WP-Zan的点赞数据排序WordPress的文章

导语:有一位客户遇到了一个问题,他使用了点赞插件WP-Zan,运行一段时间后,他希望能够按照点赞的多少来排序文章。我看了一下插件的数据表,它是另外使用了一个表来记录点赞数据,点一次算一条数据,那么就没有办法使用WordPress的函数来排序文章了,需要使用SQL查询才可以,于是就有了这篇文章。

如何统计点赞数据

由于点赞插件WP-Zan用的是详细数据模式,也就是说,点赞一次,就会往数据表里面插入一次,那么你要获得某篇文章的点赞数据,必须对它进行统计。

统计所有文章的点赞数

SELECT POST_ID,COUNT(1) AS CNT FROM `wp_zan`  GROUP BY POST_ID

统计某篇文章的点赞数,我这里用的是第一篇文章

SELECT POST_ID,COUNT(1) AS CNT FROM `wp_zan` where post_id =1

与wordpress文章关联

下面的语句实现了与wordpress文章表的关联,使用的是LEFT JOIN,对文章类型为post、文章状态为publish、在1800天以内的文章按照点赞数从多到少的排序,输出结果为5条记录。

SELECT a.ID,a.post_title,a.post_name,b.cnt  
FROM `wp_posts` AS A 
LEFT JOIN (SELECT POST_ID,COUNT(1) AS CNT FROM `wp_zan`  GROUP BY POST_ID) AS B 
on a.ID= B.post_id 
WHERE 1 
and a.post_type = 'post' 
and a.post_status ='publish'  
and TO_DAYS(NOW()) - TO_DAYS(a.post_date) <= 1800 
order by a.post_date DESC 
limit 0,5

完整的php代码

下面没有变化的sql和代码,直接使用的是上面的sql。先声明全局表里$wpdb,然后定义查询字符串,然后执行结果。

global $wpdb;
$querystr = "SELECT a.ID,a.post_title,a.post_name,b.cnt  FROM `wp_posts` AS A LEFT JOIN (SELECT POST_ID,COUNT(1) AS CNT FROM `wp_zan`  GROUP BY POST_ID) AS B on a.ID= B.post_id WHERE 1 and a.post_type = 'post' and a.post_status ='publish'  and TO_DAYS(NOW()) - TO_DAYS(a.post_date) <= 1800 order by a.post_date DESC limit 0,5";  
$results = $wpdb->get_results($wpdb->prepare($querystr,0),ARRAY_A);

如何变化

我们一般是对统计时间段和输出的条数来进行变化。

首先对查询字符串进行变化,将常量1800和5改为变量。

$querystr = "SELECT a.ID,a.post_title,a.post_name,b.cnt  FROM `wp_posts` AS A LEFT JOIN (SELECT POST_ID,COUNT(1) AS CNT FROM `wp_zan`  GROUP BY POST_ID) AS B on a.ID= B.post_id WHERE 1 and a.post_type = 'post' and a.post_status ='publish'  and TO_DAYS(NOW()) - TO_DAYS(a.post_date) <= '%d' order by a.post_date DESC limit 0,'%d'";  

然后对输出结果的执行语句做以下修改,那么这条语句的意思是:搜索7天之内的五条记录。

$results = $wpdb->get_results($wpdb->prepare($querystr,7,5),ARRAY_A);  

这条语句的意思是:搜索30天之内的五条记录。

$results = $wpdb->get_results($wpdb->prepare($querystr,30,5),ARRAY_A); 

如果要从全部的记录中查询,那么就用下面的SQL。

$querystr = "SELECT a.ID,a.post_title,a.post_name,b.cnt  FROM `wp_posts` AS A LEFT JOIN (SELECT POST_ID,COUNT(1) AS CNT FROM `wp_zan`  GROUP BY POST_ID) AS B on a.ID= B.post_id WHERE 1 and a.post_type = 'post' and a.post_status ='publish'   order by a.post_date DESC limit 0,'%d'";  
$results = $wpdb->get_results($wpdb->prepare($querystr,5),ARRAY_A); 

注意,这里使用的是数据库安全查询,所以是这样的形式,你也可以直接在get_results()使用查询字符串。
查询结果会有三种形式:关联数组,ARRAY_A; 数值数组,ARRAY_N; 默认值,OBJECT。这里使用了关联数组,ARRAY_A。

如何使用结果

$results[ID] 这个是文章ID 如果你使用的是ID形式的网址,就用这个来拼接出真实的网址。
$results[post_title] 这个是文章标题。
$results[post_name] 这个是文章的名字,如果你使用的是英文形式的网址,就用这个来拼接出真实的网址。
$results[cnt] 这个点赞的次数。

结束

好了,把语句放入你需要的地方就可以使用了。其实对这个插件而言,用wp_postmeta记录点赞数据就可以了。你学会了吗?没有学会的话,请在下面留言,大家一起讨论。如果,你希望下载这个插件可以在wordpress官方搜索“WordPress 文章点赞”,或者前往https://wordpress.org/plugins/wp-zan/。


Warning: copy(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /opt/lampp/htdocs/wordpresssummer/wp-content/themes/summerleaf/inc/summer_setting.php on line 546

Warning: copy(): Failed to enable crypto in /opt/lampp/htdocs/wordpresssummer/wp-content/themes/summerleaf/inc/summer_setting.php on line 546

Warning: copy(https://www.wordpressleaf.com/wp-content/themes/summerleaf/images/tx/50.png): failed to open stream: operation failed in /opt/lampp/htdocs/wordpresssummer/wp-content/themes/summerleaf/inc/summer_setting.php on line 546

目前在“如何使用点赞插件WP-Zan的点赞数据排序WordPress的文章”上有一条评论


  1. Warning: copy(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /opt/lampp/htdocs/wordpresssummer/wp-content/themes/summerleaf/inc/summer_setting.php on line 546

    Warning: copy(): Failed to enable crypto in /opt/lampp/htdocs/wordpresssummer/wp-content/themes/summerleaf/inc/summer_setting.php on line 546

    Warning: copy(https://www.wordpressleaf.com/wp-content/themes/summerleaf/images/tx/54.png): failed to open stream: operation failed in /opt/lampp/htdocs/wordpresssummer/wp-content/themes/summerleaf/inc/summer_setting.php on line 546
    liyang说道:

    能不能把这个做成插件的形式?

发表评论

邮箱地址不会被公开。 必填项已用*标注