3

我正在建立一种让我的用户“喜欢”帖子的方式。

我将拥有一系列喜欢帖子的用户:

$user_ids = array(60, 61, 62, 63);

然后一个帖子会有一个 post_meta,当点击一个帖子的“like”按钮时,它会保存用户 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 类。

谢谢!

4

4 回答 4

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);

请参阅上面给出的示例“时间参数”标题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() ");

我已经使用了INNER JOINsonwp_term_relationships并且 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).")
于 2013-08-07T00:13:32.980 回答
3

您将在当前方法中遇到问题,因为正如您所注意到的,ID 被保存为单个字段中的序列化数组。一种更简单的方法是将每个赞保存为单个 postmeta 条目。所以 meta_key = "like" 和 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 数组即可。

于 2013-08-06T19:56:36.930 回答
3

我有一个类似的问题,我使用 serialize() 解决了它,如果你正在使用的 vale 是一个整数,你可以使用 ir 这是我的例子:

    $args = array(
    'meta_query' => array(
        array(
            'key' => 'my_meta_key',
            'value' => serialize(strval($my_id)),
            'compare' => 'LIKE'
        )
    )
);
$posts = get_posts( $args );

就是这样,您已经准备好元查询。

于 2015-07-15T13:48:24.663 回答
0

你的查询是对的。但是当您将用户 ID 存储为字符串时,您的查询将不起作用。将用户 ID 保存为发布的单个元值。

add_post_meta($post->ID, 'like', $user_id, false);

并替换'compare' => 'IN''compare' => 'LIKE'

于 2013-08-07T12:08:40.440 回答