当前位置: 首页>>技术解读>>正文


如何使用meta_field数组创建meta_query?

webfans 技术解读 , , 去评论

问题描述

以下是我查询的参数:

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
        )
    )
);

这在topics是一个字符串时有效,但在它是一个数组时则不行。当topics是例如array( 'sports', 'nonprofit', etc. )时,我希望此查询起作用

有没有办法使用数组构建元查询作为meta_key?

最佳解决办法

为查询提供可能值的数组

如果数据库中的值是字符串,并且您希望为查询提供多个值:

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => array ( 'sports', 'nonprofit', 'community' ),
            'compare' => 'IN'
        )
    )
);

在序列化数据数组中搜索特定值

如果数据库中的值是一个包含多个主题的数组,并且您希望在该数组中搜索单个主题(请注意,数据库中的数组可以如此检索,但是以序列化形式存在于数据库中,这是一个字符串也):

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
            'compare' => 'LIKE'
        )
    )
);

使用’LIKE’作为比较值并不像您希望的那样是clear-cut指令,但它是最佳选择。

接下来,您唯一的另一个选择是检索所有设置了meta_key “topics”的帖子并手动迭代它们,换句话说,检查循环中的值并显示所述条件下的帖子。

次佳解决办法

为了取消Johannes的回应,因为它是一个序列化的数组,如果你碰巧存储了类似用户id的东西(这是我的情况),你可能需要稍微改变一下。

Post meta被保存为:

array( "1", "23", "99");

所以是的,它们是整数,但通过update_post_meta,它们被保存为字符串。

'meta_query' => array(
            array(
                    'key'     => 'my_meta_key',
                    'value'   => serialize( strval( 1 ) ),
                    'compare' => 'LIKE'
                )
            )

因此,您实际上正在与您正在寻找的序列化字符串版本进行LIKE比较。我花了几个小时试图让这样的东西工作,到目前为止这是我能想到的最好的。

第三种解决办法

@sMyles回答的另一个小改进。

我有过将ID存储为字符串(例如从表单输入中获取)和整数(例如update_post_meta($post_id, authorized_users', array(get_current_user_id()));)的情况。这有点类似于wp_set_object_terms()的well-known问题,您可以使用术语ID来设置术语,但如果您不首先将它们作为整数强制转换,那么您有大约50%的机会创建新术语,而将这些数字作为其名称来代替。

这可能导致它们在序列化数组中的存储方式完全不同,从我的测试站点数据库的这种情况的摘录中可以看出:

a:1:{i:0;s:1:"1";} // 's' for 'string', also note the double quotes
a:1:{i:0;i:1;} // 'i' for 'integer', no quotes

当通过print_r()馈送时,上述两者都将呈现为

Array
(
    [0] => 1
)

为了解决这个问题,我通过添加relation和另一个版本的查询来对meta_query稍作调整,该查询将值转换为整数而不是字符串。

这是最终结果:

        'meta_query' => array(
            'relation' => 'OR', // Lets it know that either of the following is acceptable
            array(
                'key' => 'bcm_enm_authorized_users',
                'value'   => serialize(strval(get_current_user_id())), // Saved as string
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'bcm_enm_authorized_users',
                'value'   => serialize(intval(get_current_user_id())), // Saved as integer
                'compare' => 'LIKE'
            ),
        ),

编辑:刚刚意识到这种方法可能存在与数组索引冲突的风险,这可能允许某人非法访问材料(如果他们不在数组中),但他们的用户ID显示为索引。因此,虽然如果你有讨论的问题,这是有效的,但更好的做法是确保你想要搜索的任何值在保存之前被转换为字符串,以便你可以使用@sMyles的方法。

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2413.html,转载请务必附带本地址声明。