WordPress管理员查询

发布于 2025-01-11 20:00:29 字数 1015 浏览 0 评论 0原文

我的 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 制作的。我觉得这是一个用所有管理员帐户填充某些下拉列表的查询,但我一生都找不到触发它的原因。

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

I have a rather large user db on my WordPress database (around 1m).

I am seeing a slow query on my log and it looks like this:

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;

I think it is made by wp-includes/class-wp-user-query.php. I feel like this is a query to populate some dropdown with all the administrator accounts, but for the life of me I cannot find out what triggers it.

I want to find what is triggering it and stop it from executing this query. (Listing admins is not something I'm intending on using.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

長街聽風 2025-01-18 20:00:29

有两个地方会使用此查询:

  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)

There are two places where this query gets used:

  1. when preparing the dropdown list of authors for use in the posts and pages Quick Edit functionality.
  2. in the REST API when preparing the choice of authors for the Gutenberg editor page.

Here are a couple of snippets of code (this is a hack) to constrain those lists of authors to the first twenty wp_users.ID values. The query times will go from ridiculous to quick.

For the REST user query list:

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;
}

For the posts and pages Quick Edit dropdown:

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;
}

If your contributors / authors / editors / administrators aren't among the first twenty user IDs on your site, you can use an array containing a list of their user IDs in place of range( 0, 20 ).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文