【问题标题】:Comparing arrays in WP_Query with custom fields将 WP_Query 中的数组与自定义字段进行比较
【发布时间】:2022-10-01 00:30:18
【问题描述】:

我在比较 wp_query 中两个数组之间的值时遇到问题

我有两个角色 administrator 和 forhandler_salg($roles 返回一个包含这两个值的数组),但它只查询将“public”键设置为 true 的帖子

当我将 \"allowed_userroles\" 键比较值更改为 \"LIKE\" 时,我收到了更多帖子,但这些帖子不是正确的

$roles = \"\";

if (is_user_logged_in()) {

    $user = wp_get_current_user();

    $roles = (array) $user->roles;
}

$args = array(
    \'post_type\' => \'downloads\',
    \'posts_per_page\' => \'-1\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array(
            \'key\' => \'public\',
            \'value\' => true,
            \'compare\' => \'=\',
        ),
        # Not working
        array(
            \'key\' => \'allowed_userroles\',
            \'value\' => $roles,
            \'compare\' => \'IN\',
        ),
    ),
);

print_r($args) 返回

    Array
(
    [post_type] => downloads
    [posts_per_page] => -1
    [meta_query] => Array
        (
            [relation] => OR
            [0] => Array
                (
                    [key] => public
                    [value] => 1
                    [compare] => =
                )

            [1] => Array
                (
                    [key] => allowed_userroles
                    [value] => Array
                        (
                            [16] => administrator
                            [17] => forhandler_salg
                        )

                    [compare] => IN
                )

        )

)

当我 print_r() 帖子的 allowed_userroles 时,将“public”自定义字段设置为 true 并添加一些角色的帖子会返回此内容:

Array
(
    [0] => role1
    [1] => role2
    [2] => role3
)

我将如何检查查询中的 allowed_userroles 是否具有 $roles 中也存在的值?

编辑:如果我手动输入一个角色,\“like\”就可以了

  • 您是否尝试过拆分 $roles 中的值并将它们中的每一个添加到元查询中?
  • @TPaone 嗯,我只是尝试用 implode 来做,它似乎可以工作,但是在我用 implode 变量替换 $roles 变量之后,它重复了 21 次,似乎每个帖子一次
  • 我更多地考虑查询看起来更像public =\"true\" OR allowed_userroles LIKE \"%Role1%\" OR allowed_userroles LIKE \"%Role2%\"。我假设allowed_userroles 字段存储的是逗号分隔的字符串?
  • 哦,问题是它是一个动态自定义字段,所以我无法对其进行硬编码,并且 LIKE 还不够好,因为它会返回包含角色中的单词的任何帖子 + 更多添加到它似乎也不起作用(从我的第一条评论开始),它只是为每个帖子重复一次
  • 是的,我明白了。您只需分解角色数组,然后将每个角色添加为单独的 meta_query 条件。关于结果的数量,这可能是 OR 条件返回 true 的情况。您可能需要添加查询监视器插件来查看 SQL 语法并检查生成的语法是否符合预期。如有疑问,您始终可以使用 $wpdb 并构建您自己的查询。

标签: wordpress advanced-custom-fields


【解决方案1】:

好的,对于这类问题,从基本的参数数组开始然后修改它会更容易。

由于此问题使用 ACF 标记,因此 ACF 可能会将其存储为单个元条目。此外,如果这是一个值数组,ACF 很可能会将其作为序列化的 PHP 字符串存储在数据库中(例如,a:2:{i:0;s:4:"1234";i:1;s:3:"qed";})。

让我们从基本代码开始:

$roles = [];

if (is_user_logged_in()) {

    $user = wp_get_current_user();
    $roles = (array) $user->roles;
}

$args = array(
    'post_type' => 'downloads',
    'posts_per_page' => -1,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'public',
            'value' => "1",
            'compare' => '=',
        ),
    ),
);

在这种情况下,您需要使用 LIKE 来尝试子字符串匹配。

foreach($roles as $role) {
    $args['meta_query'][] = [
        'key' => 'allowed_userroles',
        'value' => $role, // can't remember if wp will wrap value with %
        'compare' => 'LIKE',
    ];
}

理想情况下,您也希望根据字符串长度进行匹配,但这可能有点令人望而却步。如果您在获取准确结果时一直遇到问题,您可以运行两个单独的查询。第一个查询将针对所有公共项目,第二个查询将针对非公共项目。然后,您可以获取第二个查询的结果,然后过滤掉没有正确元数据的值,因为使用get_field('allowed_userroles') 会更容易处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多