我正在构建一种让用户"喜欢"帖子的方法。
我将有一系列喜欢帖子的用户:
$user_ids = array(60, 61, 62, 63);
然后,帖子将有一个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);
那么我如何返回用户喜欢的所有帖子。这就是我目前的做法,这是行不通的。
$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);
这应该返回在帖子"喜欢"元中保存了"60、61、62、63"的所有帖子。但它返回 0 个结果。
现在,我认为这是因为WordPress在将数组保存在post_meta中时对其进行序列化。
那么,我该如何进行这样的查询呢?甚至可能吗?也许我必须使用$wpdb类。
谢谢!
尝试这个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);
请参阅上面给出的示例"时间参数"标题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);
或者通过自定义查询,您可以执行以下操作
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()");
也不要将 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);
}
以下是您在赏金评论中要求的查询
如果给出了$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() ");
我在wp_term_relationships
上使用了INNER JOINs
,wp_term_taxonomy
存储帖子关系和类别分类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,)
2. 通过 ID 数组忽略帖子
AND wp.ID NOT IN (100,101,102)
or $postids =array(100,101,102);
AND wp.ID NOT IN (".join(',',$postids).")
当前的方法会遇到问题,因为正如您所注意到的,id 被保存为单个字段中的序列化数组。一种更简单的方法是将每个 like 保存为单个 postmeta 条目。所以meta_key="喜欢",meta_value=用户ID。
因此,对于存储,喜欢从update_post_meta切换到add_post_meta:
/** The fourth parameter, false, tells WP that there can be multiple
* post_meta entries with the same meta_key. It's false by default, just here
* here for reference
*/
add_post_meta($post->ID, 'like', $user_id, false);
然后,要获得特定用户喜欢的帖子,您只需执行以下操作:
$liked_posts = $wpdb->get_results("SELECT post_id FROM {$wpdb->prefix}postmeta
WHERE meta_key = 'like' AND meta_value = $user_id");
一次获取多个用户的结果,例如用户 ID 4、23、39 等。
$liked_posts_by_user = $wpdb->get_results("SELECT meta_value as user_id,
GROUP_CONCAT(post_id) as posts FROM {$wpdb->prefix}wp_postmeta
WHERE meta_value IN('22','23','24') GROUP BY user_id
这将为您提供以下结果:
user_id posts
23 1
25 2,40,3
因此,只需将查询的 IN 部分替换为您的用户 ID 数组即可。
我有一个类似的问题,我使用 serialize(( 解决了它,如果您正在使用的 vale 是一个整数,您可以使用 ir,这是我的例子:
$args = array(
'meta_query' => array(
array(
'key' => 'my_meta_key',
'value' => serialize(strval($my_id)),
'compare' => 'LIKE'
)
)
);
$posts = get_posts( $args );
仅此而已,您准备好了元查询。
你的查询是正确的。但是,当您将用户 ID 存储为字符串时,您的查询将不起作用。为发布保存用户 ID 的单个元值。
add_post_meta($post->ID, 'like', $user_id, false);
并将'compare' => 'IN'
替换为'compare' => 'LIKE'