Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按数组大小查询WordPress_Php_Sql_Wordpress - Fatal编程技术网

Php 按数组大小查询WordPress

Php 按数组大小查询WordPress,php,sql,wordpress,Php,Sql,Wordpress,我有一个允许用户“喜欢”帖子的网站。帖子的喜好以用户ID数组的形式存储在名为“likers”的Posteta字段中 我无法按最喜欢的顺序显示帖子。理想情况下,我可以查询likers数组的大小并按该值排序,但我找不到使用WP_查询的方法 现在我正在查询每个帖子的ID和likers字段,然后在foreach循环中我计算likers数组的大小,按该值排序,并使用自定义循环显示每个帖子。除了这个方法,我不能使用标准的WP分页函数 SELECT ID, post_title, SUBSTR(m.meta_

我有一个允许用户“喜欢”帖子的网站。帖子的喜好以用户ID数组的形式存储在名为“likers”的Posteta字段中

我无法按最喜欢的顺序显示帖子。理想情况下,我可以查询likers数组的大小并按该值排序,但我找不到使用WP_查询的方法

现在我正在查询每个帖子的ID和likers字段,然后在foreach循环中我计算likers数组的大小,按该值排序,并使用自定义循环显示每个帖子。除了这个方法,我不能使用标准的WP分页函数

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
有谁有更好的解决办法吗

以下是当前代码:

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) {
global$wpdb;
$posts=$wpdb->get_results(“从$wpdb->postmeta中选择post_id,meta_值,其中meta_键='likers','ARRAY_A');
如果(!$posts){
返回“未找到帖子”;
}否则{
//将它们添加到具有“likers”字段大小的数组中
foreach($posts as&$post){
$post['likers']=计数(未序列化($post['meta_value']);
}
//按喜好对数组排序
uasort($posts,function($i,$j){
$a=$i['likers'];
$b=$j['likers'];
如果($a==$b)返回0;
elseif($a<$b)回报1;
否则返回-1;
});
//现在显示帖子。。。
foreach($posts作为$post){

我不确定如何在数据库中存储喜欢的数量。如果将数据存储为逗号分隔的字符串,,您可以编写如下查询,按照喜欢的数量对帖子进行排序:

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_值的长度减去
meta_值的长度
,然后加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

完成J Richard Snape。@J-Richard-Snape你删除评论的原因是什么?为了子孙后代,我上面的评论是回应J Richard Snape要求显示我的当前代码。当你说元值存储为一个用户ID数组时,你的意思是像这样的
1,2,3,4
?请为帖子添加一个存储在元字段中的值示例这是一个序列化数组,例如a:4:{i:0;s:4:“1714”;i:1;i:1333;i:2;i:3;s:2:“38”}这是一个序列化数组,例如a:4:{i:0;s:4:“1714”;i:1;i:1333;i:2;i:1332;i:3;s:2:“38”}所以我们真正想要的是紧跟在第一个“:”(冒号)后面的数字.@Seano-我做了一个更新,只要每个用户id都存储为序列化字符串,该更新就可以运行。在上面的示例中,似乎在存储数据时混合了整数和字符串。谢谢Cyclone。你说得对,我认为我的数组都坏了。我上面发布的一个似乎有索引,没有大小字段。因为你的答案这是最有帮助的,我接受了。谢谢你的时间。