函数文档

wp_ajax_search_plugins()

💡 云策文档标注

概述

wp_ajax_search_plugins() 是一个 WordPress AJAX 处理函数,用于通过 AJAX 搜索插件。它验证请求、设置屏幕对象、准备插件列表表数据,并返回 JSON 响应。

关键要点

  • 函数通过 check_ajax_referer() 验证 AJAX 请求的安全性,使用 'updates' nonce。
  • 调用 wp_plugin_update_rows() 确保插件更新行钩子被正确挂载。
  • 根据 $_POST['pagenow'] 设置当前屏幕(如 'plugins' 或 'plugins-network'),以适配不同管理界面。
  • 使用 _get_list_table() 获取 WP_Plugins_List_Table 实例,并检查用户权限(ajax_user_can())。
  • 通过修改 $_SERVER['REQUEST_URI'] 和设置 $GLOBALS['s'] 来处理搜索查询和分页。
  • 调用 prepare_items() 和 display() 方法生成插件列表,并通过 ob_start() 和 ob_get_clean() 捕获输出。
  • 最终使用 wp_send_json_success() 或 wp_send_json_error() 返回 JSON 响应,包含项目计数和 HTML 内容。

代码示例

function wp_ajax_search_plugins() {
    check_ajax_referer( 'updates' );
    wp_plugin_update_rows();
    $pagenow = isset( $_POST['pagenow'] ) ? sanitize_key( $_POST['pagenow'] ) : '';
    if ( 'plugins-network' === $pagenow || 'plugins' === $pagenow ) {
        set_current_screen( $pagenow );
    }
    $wp_list_table = _get_list_table( 'WP_Plugins_List_Table', array( 'screen' => get_current_screen() ) );
    $status = array();
    if ( ! $wp_list_table->ajax_user_can() ) {
        $status['errorMessage'] = __( 'Sorry, you are not allowed to manage plugins for this site.' );
        wp_send_json_error( $status );
    }
    $_SERVER['REQUEST_URI'] = add_query_arg( array_diff_key( $_POST, array( '_ajax_nonce' => null, 'action' => null ) ), network_admin_url( 'plugins.php', 'relative' ) );
    $GLOBALS['s'] = wp_unslash( $_POST['s'] );
    $wp_list_table->prepare_items();
    ob_start();
    $wp_list_table->display();
    $status['count'] = count( $wp_list_table->items );
    $status['items'] = ob_get_clean();
    wp_send_json_success( $status );
}

注意事项

  • 此函数仅用于 AJAX 请求,需通过 WordPress AJAX 钩子调用,例如 add_action('wp_ajax_search_plugins', 'wp_ajax_search_plugins')。
  • 权限检查依赖于 WP_Plugins_List_Table::ajax_user_can(),确保用户有管理插件的权限。
  • 函数内部使用了多个 WordPress 核心函数,如 sanitize_key()、wp_unslash() 和 add_query_arg(),以增强安全性和功能。
  • 返回的 JSON 响应包含 'count' 和 'items' 键,其中 'items' 是插件列表的 HTML 输出。
  • 自 WordPress 4.6.0 版本引入,使用时需注意版本兼容性。

📄 原文内容

Handles searching plugins via AJAX.

Source

function wp_ajax_search_plugins() {
	check_ajax_referer( 'updates' );

	// Ensure after_plugin_row_{$plugin_file} gets hooked.
	wp_plugin_update_rows();

	$pagenow = isset( $_POST['pagenow'] ) ? sanitize_key( $_POST['pagenow'] ) : '';
	if ( 'plugins-network' === $pagenow || 'plugins' === $pagenow ) {
		set_current_screen( $pagenow );
	}

	/** @var WP_Plugins_List_Table $wp_list_table */
	$wp_list_table = _get_list_table(
		'WP_Plugins_List_Table',
		array(
			'screen' => get_current_screen(),
		)
	);

	$status = array();

	if ( ! $wp_list_table->ajax_user_can() ) {
		$status['errorMessage'] = __( 'Sorry, you are not allowed to manage plugins for this site.' );
		wp_send_json_error( $status );
	}

	// Set the correct requester, so pagination works.
	$_SERVER['REQUEST_URI'] = add_query_arg(
		array_diff_key(
			$_POST,
			array(
				'_ajax_nonce' => null,
				'action'      => null,
			)
		),
		network_admin_url( 'plugins.php', 'relative' )
	);

	$GLOBALS['s'] = wp_unslash( $_POST['s'] );

	$wp_list_table->prepare_items();

	ob_start();
	$wp_list_table->display();
	$status['count'] = count( $wp_list_table->items );
	$status['items'] = ob_get_clean();

	wp_send_json_success( $status );
}

Changelog

Version Description
4.6.0 Introduced.