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制作的。我觉得这是一个用所有管理员帐户填充一些下拉列表的查询,但就我的生活而言,我无法找出是什么触发了它。

我想找到触发它的原因并阻止它执行此查询。 (列表管理员不是我打算使用的东西。

有两个地方使用了这个查询:

  1. 准备用于帖子和页面快速编辑功能的作者下拉列表时。
  2. 在 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 )