wp_ajax_query_themes()
云策文档标注
概述
wp_ajax_query_themes() 是一个 WordPress AJAX 处理函数,用于通过 themes_api() 获取主题信息,并返回 JSON 格式的响应。它主要用于主题安装界面,处理主题查询、权限检查、数据过滤和 URL 生成等任务。
关键要点
- 函数通过 AJAX 处理主题查询请求,要求用户具有 'install_themes' 权限。
- 使用 wp_parse_args() 解析请求参数,默认每页显示 20 个主题,并包含特定字段如 reviews_url。
- 支持 'favorites' 浏览模式,自动获取用户收藏的主题。
- 应用过滤器 install_themes_table_api_args_ 来修改查询参数。
- 调用 themes_api() 获取主题数据,处理错误并返回 JSON 响应。
- 为每个主题生成安装、激活和自定义 URL,根据多站点和用户权限调整。
- 使用 wp_kses() 过滤主题信息,确保安全性。
- 计算主题星级评分、兼容性检查,并格式化数据。
代码示例
function wp_ajax_query_themes() {
global $themes_allowedtags, $theme_field_defaults;
if ( ! current_user_can( 'install_themes' ) ) {
wp_send_json_error();
}
$args = wp_parse_args(
wp_unslash( $_REQUEST['request'] ),
array(
'per_page' => 20,
'fields' => array_merge(
(array) $theme_field_defaults,
array(
'reviews_url' => true,
)
),
)
);
// 更多代码...
}注意事项
- 函数依赖于 themes_api() 来获取主题数据,需确保 API 可用。
- 在多站点环境中,激活 URL 会指向网络管理界面。
- 使用 wp_kses() 过滤输出,防止 XSS 攻击。
- 非多站点且用户有相应权限时,会生成自定义 URL。
原文内容
Handles getting themes from themes_api() via AJAX.
Source
function wp_ajax_query_themes() {
global $themes_allowedtags, $theme_field_defaults;
if ( ! current_user_can( 'install_themes' ) ) {
wp_send_json_error();
}
$args = wp_parse_args(
wp_unslash( $_REQUEST['request'] ),
array(
'per_page' => 20,
'fields' => array_merge(
(array) $theme_field_defaults,
array(
'reviews_url' => true, // Explicitly request the reviews URL to be linked from the Add Themes screen.
)
),
)
);
if ( isset( $args['browse'] ) && 'favorites' === $args['browse'] && ! isset( $args['user'] ) ) {
$user = get_user_option( 'wporg_favorites' );
if ( $user ) {
$args['user'] = $user;
}
}
$old_filter = isset( $args['browse'] ) ? $args['browse'] : 'search';
/** This filter is documented in wp-admin/includes/class-wp-theme-install-list-table.php */
$args = apply_filters( 'install_themes_table_api_args_' . $old_filter, $args );
$api = themes_api( 'query_themes', $args );
if ( is_wp_error( $api ) ) {
wp_send_json_error();
}
$update_php = network_admin_url( 'update.php?action=install-theme' );
$installed_themes = search_theme_directories();
if ( false === $installed_themes ) {
$installed_themes = array();
}
foreach ( $installed_themes as $theme_slug => $theme_data ) {
// Ignore child themes.
if ( str_contains( $theme_slug, '/' ) ) {
unset( $installed_themes[ $theme_slug ] );
}
}
foreach ( $api->themes as &$theme ) {
$theme->install_url = add_query_arg(
array(
'theme' => $theme->slug,
'_wpnonce' => wp_create_nonce( 'install-theme_' . $theme->slug ),
),
$update_php
);
if ( current_user_can( 'switch_themes' ) ) {
if ( is_multisite() ) {
$theme->activate_url = add_query_arg(
array(
'action' => 'enable',
'_wpnonce' => wp_create_nonce( 'enable-theme_' . $theme->slug ),
'theme' => $theme->slug,
),
network_admin_url( 'themes.php' )
);
} else {
$theme->activate_url = add_query_arg(
array(
'action' => 'activate',
'_wpnonce' => wp_create_nonce( 'switch-theme_' . $theme->slug ),
'stylesheet' => $theme->slug,
),
admin_url( 'themes.php' )
);
}
}
$is_theme_installed = array_key_exists( $theme->slug, $installed_themes );
// We only care about installed themes.
$theme->block_theme = $is_theme_installed && wp_get_theme( $theme->slug )->is_block_theme();
if ( ! is_multisite() && current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
$customize_url = $theme->block_theme ? admin_url( 'site-editor.php' ) : wp_customize_url( $theme->slug );
$theme->customize_url = add_query_arg(
array(
'return' => urlencode( network_admin_url( 'theme-install.php', 'relative' ) ),
),
$customize_url
);
}
$theme->name = wp_kses( $theme->name, $themes_allowedtags );
$theme->author = wp_kses( $theme->author['display_name'], $themes_allowedtags );
$theme->version = wp_kses( $theme->version, $themes_allowedtags );
$theme->description = wp_kses( $theme->description, $themes_allowedtags );
$theme->stars = wp_star_rating(
array(
'rating' => $theme->rating,
'type' => 'percent',
'number' => $theme->num_ratings,
'echo' => false,
)
);
$theme->num_ratings = number_format_i18n( $theme->num_ratings );
$theme->preview_url = set_url_scheme( $theme->preview_url );
$theme->compatible_wp = is_wp_version_compatible( $theme->requires );
$theme->compatible_php = is_php_version_compatible( $theme->requires_php );
}
wp_send_json_success( $api );
}
Changelog
| Version | Description |
|---|---|
| 3.9.0 | Introduced. |