希望有人能帮我。
加载多个用户时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
非常感谢您的帮助!
最合适的回答,由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
在这里,只需一个查询即可加载大量用户及其功能/角色。