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. |