WordPress元查询数组

Dre*_*ker 3 php mysql wordpress serialization metadata

我正在建立一种方式来形成我的用户"喜欢"一个帖子.

我会有一些喜欢帖子的用户:

$user_ids = array(60, 61, 62, 63);
Run Code Online (Sandbox Code Playgroud)

然后一个帖子会有一个post_meta,当点击帖子上的"喜欢"按钮时会保存用户ID,如下所示:

// Build array of user IDs that have liked this post
$likes = array(61, 62);

// Save array
update_post_meta($post->ID, likes, $likes);
Run Code Online (Sandbox Code Playgroud)

那么如何才能返回用户喜欢的所有帖子.这就是我目前正在做的事情,但这不起作用.

$args = array(
    'post_type'         => 'post',
    'post_status'       => 'publish',
    'posts_per_page'    => -1,
    'orderby'           => 'rand',
    'meta_query'        => array(
        'relation'  => 'AND',
        array(
            'key'       => 'likes',
            'value'     => $user_ids,
            'compare'   => 'IN'
        )
    )
);
$posts = get_posts($args);
Run Code Online (Sandbox Code Playgroud)

这应该返回帖子'likes'meet中保存有'60,61,62,63'的所有帖子.但它返回0结果.

现在,我认为这是因为WordPress在将数组保存在post_meta时序列化数组.

那么,我该怎么做这样的查询呢?它甚至可能吗?也许我必须使用$ wpdb类.

谢谢!

M K*_*aid 21

尝试这个WP_Query不需要关系只需使用比较部分IN

 $user_ids = array(60, 61, 62, 63);
 $args = array(
   'post_type' => 'post',
   'meta_key' => 'likes',
   'post_status'       => 'publish',
   'posts_per_page'    => -1,
   'orderby'           => 'rand',       
   'order' => 'ASC',
   'meta_query' => array(
       array(
           'key' => 'likes',
           'value' => $user_ids, //array
           'compare' => 'IN',
       )
   )
 );
 $query = new WP_Query($args);
Run Code Online (Sandbox Code Playgroud)

请参阅上面给出的示例"时间参数"标题WP_Query

或者通过get_posts试试这个

$args = array(
    'post_type'         => 'post',
    'post_status'       => 'publish',
    'posts_per_page'    => -1,
    'orderby'           => 'rand',
    'meta_query'        => array(

        array(
            'key'       => 'likes',
            'value'     => $user_ids,
            'compare'   => 'IN'
        )
    )
);
$posts = get_posts($args);
Run Code Online (Sandbox Code Playgroud)

或者通过自定义查询,您可以执行以下操作

global $wpdb;

$liked_posts=$wpdb->get_results("SELECT * FROM `wp_posts` WHERE 
post_type='post' AND post_status ='publish' AND ID
 IN(
SELECT post_id FROM `wp_postmeta` WHERE meta_key='likes' 
AND meta_value IN (".join(',',$user_ids).")
) ORDER BY RAND()");
Run Code Online (Sandbox Code Playgroud)

也不要在一行中存储id数组而是循环遍历ids数组并手动规范化您喜欢的数据不要将数据序列化到数据库字段中.这就是Database_normalization的用途,并将每个id插入新行,因为

Wordpress将元值存储为字符串.传递 update_post_meta数组时,它会自动将其转换为字符串.你需要做的是unserialize当你试图读取数据但在mysql中你不能unserialize在查询中列数据,因为mysql不关于php的序列化

$likes = array(61, 62);

foerach($likes as $l){

update_post_meta($post->ID, "likes", $l);

}
Run Code Online (Sandbox Code Playgroud)

以下是您在赏金评论中要求的查询

如果给出了$ wpdb答案,那么请详细说明如何考虑类别(包含和排除),并按ID数组忽略帖子

$liked_posts=$wpdb->get_results("
SELECT * FROM `wp_posts` wp
INNER JOIN `wp_term_relationships` wtr ON (wp.`ID`=wtr.`object_id`)
INNER JOIN  `wp_term_taxonomy` wtt ON (wtr.`term_taxonomy_id` =wtt.`term_taxonomy_id`)
WHERE  wp.post_type='post' AND wp.post_status ='publish' AND wp.ID
 IN(
SELECT post_id FROM `wp_postmeta` WHERE meta_key='likes' 
AND meta_value IN (".join(',',$user_ids).")
)  AND wp.ID NOT IN (100,101,102)
AND wtt.`term_id` IN(1,2,3) AND wtt.`term_id` NOT IN (4,5,6,)    
ORDER BY RAND() ");
Run Code Online (Sandbox Code Playgroud)

我已经使用了INNER JOINson wp_term_relationshipswp_term_taxonomytable wp_term_relationships存储了帖子的关系和类别的分类,这个表wp_term_taxonomy有类别的分类和类别id

这是涵盖的部分

1.类别(包含和排除)

AND wtt.`term_id` IN(1,2,3) AND wtt.`term_id` NOT IN (4,5,6,) 
Run Code Online (Sandbox Code Playgroud)

2.通过一系列ID忽略帖子

AND wp.ID NOT IN (100,101,102) 
or $postids =array(100,101,102);
AND wp.ID NOT IN (".join(',',$postids).")
Run Code Online (Sandbox Code Playgroud)