【问题标题】:Get Posts based on serialized meta value根据序列化的元值获取帖子
【发布时间】:2021-01-24 09:53:01
【问题描述】:

我有一系列帖子,并且都有一个值为“owner”的 meta_key 和一个带有序列化数据的 meta_value,例如“a:3:{i:0;s:3:”325”;i:1; s:2:"41";i:2;s:2:"29";}"

元密钥owner

元值a:3:{i:0;s:3:"325";i:1;s:2:"41";i:2;s:2:"29";}

我正在尝试弄清楚如何正确使用get_posts() 来返回所有具有值为owner 的meta_key 和包含特定值(例如41)的meta_value 的帖子

    $args = array(
        'post_type' => 'rp_applications',
        'nopaging' => true,
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'compare' => '=',
                'key' => 'archived',
                'value' => '0000-00-00'
            ),
            array(
                'compare' => '=',
                'key' => 'owner',
                'value' => ???? WHAT DO I PUT HERE ????
            )
        )
    );

    $applications = get_posts($args);

【问题讨论】:

    标签: wordpress


    【解决方案1】:

    听起来您应该将“所有者”存储为分类术语而不是元数据。它还可以为您提供更轻松、更快的查询能力。

    也就是说,绝对有可能做你想做的事。不过我要小心,因为默认情况下postmeta 表是未编入索引的,因此带有元查询的大型表会大大降低您的网站速度。如果表格变得非常大,您可能需要考虑向表格添加部分索引(或者再次切换到分类术语而不是为此发布元数据)。

    如果您仍然想使用元查询,请查看compare 可用选项in the WP_Meta_Query() docs

    其中一个可用选项是REGEXP,因此您可以执行以下操作:

    $args = array(
        'post_type' => 'rp_applications',
        'nopaging' => true,
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'compare' => 'REGEXP',
                'key'     => 'owner',
                'value'   => sprintf( 'a:\d:{i:0;s:\d:"\d.*?";i:1;s:%d:"%d".*', strlen($owner_id), $owner_id )
            ),
            array(
                'compare' => '=',
                'key'     => 'archived',
                'value'   => '0000-00-00'
            )
        )
    );
    

    当然,此方法仅适用于每个序列化数据的格式相同的情况,如果不是,您需要调整正则表达式 - 但这应该足以让您开始!

    【讨论】:

    • 由于序列化数据中可能有多个值,我认为 REGEX 需要稍微不那么详细,因为它可能在值中的任何位置。我不是 REGEX 专家,但我尝试将您的代码更改为 'value' => sprintf( 's:\d:"\d";', strlen($owner_id), $owner_id ),但没有成功
    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多