按数组大小查询WordPress


Querying WordPress by array size

我有一个网站,允许用户"点赞"帖子。帖子的点赞被存储为一个名为"点赞者"的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