我有一个网站,允许用户"点赞"帖子。帖子的点赞被存储为一个名为"点赞者"的postmeta字段中的用户ID数组。
我在按最喜欢的顺序显示帖子时遇到问题。理想情况下,我可以查询likers数组的大小并按该值排序,但我找不到使用WP_query的方法。
目前,我正在查询每个帖子的ID和likers字段,然后在foreach循环中,我计算likers数组的大小,按该值排序,并使用自定义循环显示每个帖子。除了这种方法,我不能使用标准的WP分页函数。
有人能找到更好的解决方案吗?
这是当前代码:
global $wpdb;
$posts = $wpdb->get_results("SELECT post_id, meta_value FROM $wpdb->postmeta WHERE meta_key = 'likers'", 'ARRAY_A');
if (!$posts) {
return "No posts found.";
} else {
// add them to an array with the size of their 'likers' field
foreach($posts as &$post) {
$post['likers'] = count(unserialize($post['meta_value']));
}
// sort array by likes
uasort($posts, function ($i, $j) {
$a = $i['likers'];
$b = $j['likers'];
if ($a == $b) return 0;
elseif ($a < $b) return 1;
else return -1;
});
// now display the posts...
foreach($posts as $post) {
我真的不确定如何在数据库中存储点赞数。如果你将数据存储为逗号分隔的字符串<userid>,<userid>,<userid>
,你可以写一个这样的查询,按照点赞次数排序:
global $wpdb;
$posts = $wpdb->get_results("SELECT ID,
post_title,
LENGTH(m.meta_value) -
LENGTH(REPLACE(m.meta_value, ',', '')) + 1 likes
FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->postmeta} m ON m.post_ID = p.ID &&
m.meta_key = 'likes'
ORDER BY likes DESC", OBJECT);
上面通过用不带逗号的meta_value
的长度减去meta_value
的长度,然后加1来计算点赞数。
在元值包含序列化数组的情况下,您应该能够使用相同的技术。请注意,每个值都需要存储为字符串才能工作:
// serialized array of user ids
a:4:{i:0;s:4:"1714";i:1;s:4:"1333";i:2;s:4:"1332";i:3;s:2:"38";}
$posts = $wpdb->get_results("SELECT ID,
post_title,
(LENGTH(m.meta_value) -
LENGTH(REPLACE(m.meta_value, ''"', '')) - 2) * 0.5 likes
FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->postmeta} m ON m.post_ID = p.ID &&
m.meta_key = 'likes'
ORDER BY likes DESC", OBJECT);
我正在为wordpress制作一个喜欢的插件,遇到了同样的问题。正如您在一条注释中所解释的那样,我最终接近了它,该注释只是获取序列化数组中第一个"a:"之后的数字。为此,我使用了mysql SUBSTR函数。
SELECT ID, post_title, SUBSTR(m.meta_value,3,1) likes
FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->postmeta} m ON m.post_ID = p.ID && m.meta_key = 'likes'
ORDER BY likes DESC