在一个查询中获取具有元值的多个用户,并填充WP_USER类

时间:2016-11-17 作者:Jory Hogeveen

希望有人能帮我。

加载多个用户时get_users() (假设100+)WP为每个用户触发用户元查询。这将触发101个查询(每个用户的主用户查询+元查询)。

问题是,我只需要数据库中的1个元值(当前博客的功能),我发现WP\\u用户类不使用任何其他数据进行角色和功能管理。

我已经准备好了SQL,没问题。但是,有人知道如何在绕过默认元查询的同时填充WP\\u用户类吗?

(当然,这需要与其他插件随后发生的任何事情兼容)

看见wp-includes/class-wp-user.php

WP\\u用户的默认调用堆栈(当传递$wpdb->get_results() 用户对象):

WP_User->_construct
WP_User->init()
WP_User->for_blog()
WP_User->_init_caps()
    - get_user_meta()
        - update_meta_cach()
            - query :-(
为完整起见,我当前的SQL:

SELECT {$wpdb->users}.*, {$wpdb->usermeta}.meta_value FROM {$wpdb->users} 
LEFT JOIN {$wpdb->usermeta} ON {$wpdb->users}.ID = {$wpdb->usermeta}.user_id
WHERE {$wpdb->usermeta}.meta_key = \'{$wpdb->get_blog_prefix()}capabilities\'
ORDER BY {$wpdb->users}.display_name
非常感谢您的帮助!

1 个回复
最合适的回答,由SO网友:Jory Hogeveen 整理而成

任何感兴趣的人。

使用get_user_metadata 筛选以缩短元查询和缓存加载。

Steps:

  • 运行查询
  • 将结果数据存储在类属性中
  • 添加get_user_metadata 过滤器启动foreach 循环打开结果触发器new WP_User( $result_value ) 对于filter函数中的每个结果,启用validate meta key$wpdb->get_blog_prefix() . \'capabilities\'.get_user_metadata 再次过滤完成

Full query (slightly modified)

SELECT {$wpdb->users}.*, {$wpdb->usermeta}.meta_value as roles FROM {$wpdb->users} 
LEFT JOIN {$wpdb->usermeta} ON {$wpdb->users}.ID = {$wpdb->usermeta}.user_id
WHERE {$wpdb->usermeta}.meta_key = \'{$wpdb->get_blog_prefix()}capabilities\'
ORDER BY {$wpdb->users}.display_name
这将返回users表中的所有值+一个名为roles 具有meta\\u值TABLEPREFIX_capabilities

在这里,只需一个查询即可加载大量用户及其功能/角色。

相关推荐

在参数中对关系使用META_QUERY

我找到了这本指南,我正在遵循它:https://rudrastyh.com/wordpress/meta_query.html但我发现它不适用于高级自定义字段的关系。为什么?这是我的代码:$args=array( \'post_type\' => \'post\', \'post_status\' => \'publish\', \'posts_per_page\' => -1, \'meta