WordPress Version: 6.3
/**
* Handles getting themes from themes_api() via AJAX.
*
* @since 3.9.0
*
* @global array $themes_allowedtags
* @global array $theme_field_defaults
*/
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))));
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);
}