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_relationships和 wp_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)
| 归档时间: |
|
| 查看次数: |
21688 次 |
| 最近记录: |