按数组大小查询WordPress

时间:2015-03-18 11:12:14

标签: php sql wordpress

我有一个网站,允许用户喜欢'帖子。帖子的喜欢作为用户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) {

2 个答案:

答案 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