WordPress管理员查询
WordPress administrators query
我的 WordPress 数据库中有一个相当大的用户数据库(大约 1m)。
我在我的日志中看到一个缓慢的查询,它看起来像这样:
SELECT wp_users.ID,wp_users.user_login,wp_users.display_name FROM wp_users INNER JOIN wp_usermeta ON ( wp_users.ID = wp_usermeta.user_id ) WHERE 1=1 AND (
(
(
( wp_usermeta.meta_key = 'wp_capabilities' AND wp_usermeta.meta_value LIKE '%\"edit\_posts\"%' )
OR
( wp_usermeta.meta_key = 'wp_capabilities' AND wp_usermeta.meta_value LIKE '%\"administrator\"%' )
OR
( wp_usermeta.meta_key = 'wp_capabilities' AND wp_usermeta.meta_value LIKE '%\"editor\"%' )
OR
( wp_usermeta.meta_key = 'wp_capabilities' AND wp_usermeta.meta_value LIKE '%\"author\"%' )
OR
( wp_usermeta.meta_key = 'wp_capabilities' AND wp_usermeta.meta_value LIKE '%\"contributor\"%' )
)
)
) ORDER BY display_name ASC;
我认为是wp-includes/class-wp-user-query.php
制作的。我觉得这是一个用所有管理员帐户填充一些下拉列表的查询,但就我的生活而言,我无法找出是什么触发了它。
我想找到触发它的原因并阻止它执行此查询。 (列表管理员不是我打算使用的东西。
有两个地方使用了这个查询:
- 准备用于帖子和页面快速编辑功能的作者下拉列表时。
- 在 REST API 中准备为古腾堡编辑器页面选择作者时。
这里有几个代码片段(这是一个 hack),用于将这些作者列表限制为前二十个 wp_users.ID
值。查询时间将从荒谬变为快速。
对于 REST 用户查询列表:
add_filter( 'rest_user_query', 'constraint_rest_user_query', 10, 2 );
/**
* Filters WP_User_Query arguments when querying users via the REST API.
*
* @link https://developer.wordpress.org/reference/classes/wp_user_query/
*
* @since 4.7.0
*
* @param array $prepared_args Array of arguments for WP_User_Query.
* @param WP_REST_Request $request The REST API request.
*/
function constraint_rest_user_query( $prepared_args, $request ) {
if ( $request->get_param( 'context' ) === 'view'
&& $request->get_param( 'who' ) === 'authors' ) {
$prepared_args['include'] = range( 0, 20 );
}
return $prepared_args;
}
对于帖子和页面快速编辑下拉菜单:
add_filter( 'wp_dropdown_users_args', 'constrain_wp_dropdown_users_args', 10, 2 );
/**
* Filters the query arguments for the list of users in the dropdown.
*
* @param array $query_args The query arguments for get_users().
* @param array $parsed_args The arguments passed to wp_dropdown_users() combined with the defaults.
*
* @returns array Updated $query_args
* @since 4.4.0
*
*/
function constrain_wp_dropdown_users_args( $query_args, $parsed_args ) {
$query_args['include'] = range( 0, 20 );
return $query_args;
}
如果您的投稿人/作者/编辑/管理员不在您站点的前 20 个用户 ID 之列,您可以使用包含他们用户 ID 列表的数组来代替 range( 0, 20 )
。
我的 WordPress 数据库中有一个相当大的用户数据库(大约 1m)。
我在我的日志中看到一个缓慢的查询,它看起来像这样:
SELECT wp_users.ID,wp_users.user_login,wp_users.display_name FROM wp_users INNER JOIN wp_usermeta ON ( wp_users.ID = wp_usermeta.user_id ) WHERE 1=1 AND (
(
(
( wp_usermeta.meta_key = 'wp_capabilities' AND wp_usermeta.meta_value LIKE '%\"edit\_posts\"%' )
OR
( wp_usermeta.meta_key = 'wp_capabilities' AND wp_usermeta.meta_value LIKE '%\"administrator\"%' )
OR
( wp_usermeta.meta_key = 'wp_capabilities' AND wp_usermeta.meta_value LIKE '%\"editor\"%' )
OR
( wp_usermeta.meta_key = 'wp_capabilities' AND wp_usermeta.meta_value LIKE '%\"author\"%' )
OR
( wp_usermeta.meta_key = 'wp_capabilities' AND wp_usermeta.meta_value LIKE '%\"contributor\"%' )
)
)
) ORDER BY display_name ASC;
我认为是wp-includes/class-wp-user-query.php
制作的。我觉得这是一个用所有管理员帐户填充一些下拉列表的查询,但就我的生活而言,我无法找出是什么触发了它。
我想找到触发它的原因并阻止它执行此查询。 (列表管理员不是我打算使用的东西。
有两个地方使用了这个查询:
- 准备用于帖子和页面快速编辑功能的作者下拉列表时。
- 在 REST API 中准备为古腾堡编辑器页面选择作者时。
这里有几个代码片段(这是一个 hack),用于将这些作者列表限制为前二十个 wp_users.ID
值。查询时间将从荒谬变为快速。
对于 REST 用户查询列表:
add_filter( 'rest_user_query', 'constraint_rest_user_query', 10, 2 );
/**
* Filters WP_User_Query arguments when querying users via the REST API.
*
* @link https://developer.wordpress.org/reference/classes/wp_user_query/
*
* @since 4.7.0
*
* @param array $prepared_args Array of arguments for WP_User_Query.
* @param WP_REST_Request $request The REST API request.
*/
function constraint_rest_user_query( $prepared_args, $request ) {
if ( $request->get_param( 'context' ) === 'view'
&& $request->get_param( 'who' ) === 'authors' ) {
$prepared_args['include'] = range( 0, 20 );
}
return $prepared_args;
}
对于帖子和页面快速编辑下拉菜单:
add_filter( 'wp_dropdown_users_args', 'constrain_wp_dropdown_users_args', 10, 2 );
/**
* Filters the query arguments for the list of users in the dropdown.
*
* @param array $query_args The query arguments for get_users().
* @param array $parsed_args The arguments passed to wp_dropdown_users() combined with the defaults.
*
* @returns array Updated $query_args
* @since 4.4.0
*
*/
function constrain_wp_dropdown_users_args( $query_args, $parsed_args ) {
$query_args['include'] = range( 0, 20 );
return $query_args;
}
如果您的投稿人/作者/编辑/管理员不在您站点的前 20 个用户 ID 之列,您可以使用包含他们用户 ID 列表的数组来代替 range( 0, 20 )
。