我有一个网站,允许用户喜欢'帖子。帖子的喜欢作为用户ID数组存储在名为" likers"的postmeta字段中。
我无法按照最喜欢的顺序显示帖子。理想情况下,我可以查询likers数组的大小并按该值排序,但我无法使用WP_Query找到一种方法。
目前我正在查询每个帖子的ID和喜欢的字段,然后在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) {
答案 0 :(得分:1)
我不确定如何在数据库中存储喜欢的数量。如果您将数据存储为逗号分隔的字符串<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);
答案 1 :(得分:0)
我正在为wordpress制作一个喜欢的插件,并遇到了同样的问题。我最后接近它,正如你在评论中解释的那样,只是在第一个&#39; a之后得到数字:&#39;在序列化数组中。为此,我使用了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