WP查询有条件地查询元数据和分类

时间:2019-02-15 作者:Mike

我开发了一个插件,其中包括一个自定义帖子类型,该类型在WP Admin中显示为列表。

插件中定义了不同级别的用户,还有一些其他选项可以确定哪些帖子显示给当前登录的用户。此外,帖子可能属于自定义分类法。在这种情况下,进一步的条件应该确定当前用户看到的帖子。例如,也许当前用户应该能够看到所有使用部门分类法中术语支持的帖子。

我正迷上pre_get_posts 为了构建查询,确保当前用户只看到他们应该看到的帖子。管理员看到所有,其他人只看到分配给他们的帖子。对于标准元查询,这一切都可以正常工作。

我对分类法有意见。我理解,除非我自己构建了一个数据库查询,否则不可能创建一个WP查询来查询存在元键并等于一个值的帖子,或者帖子有一个特定的分类术语与之关联。

确保数据库查询最小化的最佳方法是什么?

我已经在下面发布了我当前的查询。我正在寻找关于要使用的最佳挂钩和要使用的查询的指导,以实现我所需要的。

function kbs_restrict_agent_ticket_view( $query )   {

    if ( ! is_admin() || \'kbs_ticket\' != $query->get( \'post_type\' ) )   {
        return;
    }

    $admin_agents = kbs_get_option( \'admin_agents\' );

    if ( empty( $admin_agents ) && current_user_can( \'administrator\' ) )    {
        $query->set( \'p\', \'99999999\' );
        return;
    }

    // If user is admin and admins are agents, they see all.
    if ( current_user_can( \'manage_ticket_settings\' ) ) {
        return;
    }

    if ( kbs_get_option( \'restrict_agent_view\', false ) )   {
        $agent_id = get_current_user_id();

        $meta_query = array(
            \'relation\' => \'OR\',
            array(
                \'key\'     => \'_kbs_ticket_agent_id\',
                \'value\'   => $agent_id,
                \'type\'    => \'NUMERIC\'
            ),
            array(
                \'key\'     => \'_kbs_ticket_agent_id\',
                \'value\'   => \'\'
            ),
            array(
                \'key\'     => \'_kbs_ticket_agent_id\',
                \'value\'   => \'anything\',
                \'compare\' => \'NOT EXISTS\'
            )
        );

        if ( kbs_multiple_agents() )    {
            $meta_query[] = array(
                \'key\'     => \'_kbs_ticket_agents\',
                \'value\'   => sprintf( \':%d;\', $agent_id ),
                \'compare\' => \'LIKE\'
            );
        }

        $query->set( \'meta_query\', $meta_query );

  }

} // kbs_restrict_agent_ticket_view
add_action( \'pre_get_posts\', \'kbs_restrict_agent_ticket_view\' );
我现在正在有效地寻找或发布术语(“支持”、“部门”)

1 个回复
SO网友:Antti Koskinen

如果不需要太多的工作,您可以从使用元数据切换到自定义(私有)术语,以便为代理标记票据。

因此,当创建代理(用户)时,您将运行执行的自定义函数wp_insert_term 创建agent-term, 新创建的user ID 用作term slug. 然后使用wp_set_object_terms 将代理条款附加到售票处。使用时wp_set_object_terms 您需要确保代理/用户ID作为string 作为功能$terms 参数如果尝试将用户ID传递为int WP将解释为term ID 而设定条款将失败。

通过使用代理术语,您可以避免使用meta_query 做任何事tax_query.

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post