【问题标题】:Wordpress WP_Query Multiple QueriesWordpress WP_Query 多个查询
【发布时间】:2015-03-09 12:56:04
【问题描述】:

我试图想出一种方法来查询特定作​​者的 CPT,以及 meta_key 是否具有特定值。

例如,我的 CPT 附有一个作者 ID 以及一个“收件人”自定义字段。我需要的是该作者的所有此类帖子以及“收件人”=该作者的所有此类帖子。

(希望我已经解释得足够好!)

我通常对 SQL 很满意,但只是有一个随机的大脑放屁时刻,无法弄清楚这一点。就像我说的,非常感谢任何帮助!

== 解决了==

感谢@3pepe3 建议 WP_Query 的 meta_query 参数。稍微修改了我的 CPT 逻辑,现在有了一个漂亮的工作系统。

解决方案是为每个包含原始发件人用户 ID 的帖子添加一个新的元字段,然后运行两个元查询来检索当前用户 ID 与发件人或收件人字段匹配的帖子,如下所示:

$args = array(
    'post_type' => 'activity',
    'post_status' => 'publish',
    'orderby' => 'date',
    'order' => 'DESC',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'sender',
            'value' => $user_id,
            'type' => 'BINARY',
            'compare' => '='
        ),
        array(
            'key' => 'recipient',
            'value' => $user_id,
            'type' => 'BINARY',
            'compare' => '='
        )
    )
);

$query = new WP_Query( $args );

【问题讨论】:

    标签: mysql wordpress


    【解决方案1】:

    Helo JRM47R1X, 您应该使用 WP_Query 类而不是使用 SQL 查询

    <?php
    $args = array(
        'post_type' => 'activity',
        'author' => $user_id,
        'post_status' => 'publish',
        'orderby' => 'date',
        'order' => 'DESC',
        'meta_query' => array(
            array(
                'key' => 'recipient',
                'value' => $user_id,
                'type' => 'BINARY',
                'compare' => '='
                ),
            ),
        );
    $query = new WP_Query($args);
    ?>
    

    使用 WP_Query 的优点是您可以将元查询、分类法和日期与逻辑操作数(如 OR、AND BETWEEN...)混合在一起。

    【讨论】:

    • 嗨@3pepe3,感谢您的建议,不幸的是,此查询返回的结果集仅包含作者也是收件人的结果。不过,我认为您对 meta_query 有所了解,为此 +1!
    • 根据您的回答,如果我要添加一个新的自定义字段(例如“发送者”),我可以使用多个 meta_query 数组并使用 OR 运算符来匹配接收者的发送者。有点不整洁,因为它本质上是重复了已经可用的“作者”参数,但我找不到另一种加入帖子数据和帖子元数据之间查询的方法
    • 在您的查询中检索 $user_id 是作者的帖子,然后在您的联合中检索 meta_key 'recipient 与 $user_id 相同的帖子。因此,返回仅包含作者也是收件人的结果是正常的。因此,如果您想将帖子从一位作者检索到另一位“收件人”,那么您只需更改 'author' =&gt; $author_id, 并在数组 meta_query 中选择所需的收件人 'value' =&gt; $recipient_id,(您必须声明 $author_id 和 $recipient_id)
    • 所以如果你添加'sender'字段你只需要添加一个新数组$args = array( 'post_type' =&gt; 'activity', 'post_status' =&gt; 'publish', 'orderby' =&gt; 'date', 'order' =&gt; 'DESC', 'meta_query' =&gt; array( 'relation' =&gt; 'AND', array( 'key' =&gt; 'recipient', 'value' =&gt; $recipient_id, 'compare' =&gt; '=', ), array( 'key' =&gt; 'sender', 'value' =&gt; $sender_id, 'compare' =&gt; '=' ), ) );
    • 嗨@3pepe3,问题是我无法知道“发件人”的值,我需要当前用户的排序结果列表,其中返回的帖子要么是他们自己的出版物或他们是帖子的收件人。您的最后一条评论几乎是完全正确的答案,唯一的区别是“关系”参数是“或”而不是“与”。不过,感谢您对此提供的帮助,至少可以说,当它真的不应该出现时,这令人沮丧!
    【解决方案2】:

    好吧,我终于想通了。原来我所需要的只是两个查询的联合,如下所示:

    SELECT * FROM (
        SELECT $wpdb->posts.* 
            FROM $wpdb->posts 
            WHERE $wpdb->posts.post_author = $user_id
            AND $wpdb->posts.post_type = 'activity'
            AND $wpdb->posts.post_status = 'publish'
        UNION
        SELECT $wpdb->posts.*
            FROM $wpdb->posts, $wpdb->postmeta
            WHERE $wpdb->postmeta.meta_key = 'recipient'
            AND $wpdb->postmeta.meta_value = $user_id
            AND $wpdb->posts.ID = $wpdb->postmeta.post_id
            AND $wpdb->posts.post_type = 'activity'
            AND $wpdb->posts.post_status = 'publish'
        ) as x
    ORDER BY x.post_date DESC
    

    希望这可以帮助其他遇到这个奇怪的晦涩问题的人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      相关资源
      最近更新 更多