wp_ajax_query_themes

The timeline below displays how wordpress function wp_ajax_query_themes has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

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

WordPress Version: 9.3

/**
 * Ajax handler for getting themes from themes_api().
 *
 * @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);
}

WordPress Version: 5.5

/**
 * Ajax handler for getting themes from themes_api().
 *
 * @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');
    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'));
            }
        }
        if (!is_multisite() && current_user_can('edit_theme_options') && current_user_can('customize')) {
            $theme->customize_url = add_query_arg(array('return' => urlencode(network_admin_url('theme-install.php', 'relative'))), wp_customize_url($theme->slug));
        }
        $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);
}

WordPress Version: 5.2

/**
 * Ajax handler for getting themes from themes_api().
 *
 * @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');
    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'));
            }
        }
        if (!is_multisite() && current_user_can('edit_theme_options') && current_user_can('customize')) {
            $theme->customize_url = add_query_arg(array('return' => urlencode(network_admin_url('theme-install.php', 'relative'))), wp_customize_url($theme->slug));
        }
        $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);
    }
    wp_send_json_success($api);
}

WordPress Version: 5.1

/**
 * Ajax handler for getting themes from themes_api().
 *
 * @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' => $theme_field_defaults));
    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');
    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'));
            }
        }
        if (!is_multisite() && current_user_can('edit_theme_options') && current_user_can('customize')) {
            $theme->customize_url = add_query_arg(array('return' => urlencode(network_admin_url('theme-install.php', 'relative'))), wp_customize_url($theme->slug));
        }
        $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);
    }
    wp_send_json_success($api);
}

WordPress Version: 4.6

/**
 * Ajax handler for getting themes from themes_api().
 *
 * @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' => $theme_field_defaults));
    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');
    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'));
            }
        }
        if (!is_multisite() && current_user_can('edit_theme_options') && current_user_can('customize')) {
            $theme->customize_url = add_query_arg(array('return' => urlencode(network_admin_url('theme-install.php', 'relative'))), wp_customize_url($theme->slug));
        }
        $theme->name = wp_kses($theme->name, $themes_allowedtags);
        $theme->author = wp_kses($theme->author, $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);
    }
    wp_send_json_success($api);
}

WordPress Version: 4.4

/**
 * Ajax handler for getting themes from themes_api().
 *
 * @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' => $theme_field_defaults));
    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');
    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);
        $theme->name = wp_kses($theme->name, $themes_allowedtags);
        $theme->author = wp_kses($theme->author, $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);
    }
    wp_send_json_success($api);
}

WordPress Version: 4.3

/**
 * Ajax handler for getting themes from themes_api().
 *
 * @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' => $theme_field_defaults));
    $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');
    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);
        $theme->name = wp_kses($theme->name, $themes_allowedtags);
        $theme->author = wp_kses($theme->author, $themes_allowedtags);
        $theme->version = wp_kses($theme->version, $themes_allowedtags);
        $theme->description = wp_kses($theme->description, $themes_allowedtags);
        $theme->num_ratings = sprintf(_n('(based on %s rating)', '(based on %s ratings)', $theme->num_ratings), number_format_i18n($theme->num_ratings));
        $theme->preview_url = set_url_scheme($theme->preview_url);
    }
    wp_send_json_success($api);
}

WordPress Version: 4.0

/**
 * Ajax handler for getting themes from themes_api().
 *
 * @since 3.9.0
 */
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' => $theme_field_defaults));
    $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');
    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);
        $theme->name = wp_kses($theme->name, $themes_allowedtags);
        $theme->author = wp_kses($theme->author, $themes_allowedtags);
        $theme->version = wp_kses($theme->version, $themes_allowedtags);
        $theme->description = wp_kses($theme->description, $themes_allowedtags);
        $theme->num_ratings = sprintf(_n('(based on %s rating)', '(based on %s ratings)', $theme->num_ratings), number_format_i18n($theme->num_ratings));
        $theme->preview_url = set_url_scheme($theme->preview_url);
    }
    wp_send_json_success($api);
}

WordPress Version: 9.1

/**
 * Get themes from themes_api().
 *
 * @since 3.9.0
 */
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' => $theme_field_defaults));
    $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');
    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);
        $theme->name = wp_kses($theme->name, $themes_allowedtags);
        $theme->author = wp_kses($theme->author, $themes_allowedtags);
        $theme->version = wp_kses($theme->version, $themes_allowedtags);
        $theme->description = wp_kses($theme->description, $themes_allowedtags);
        $theme->num_ratings = sprintf(_n('(based on %s rating)', '(based on %s ratings)', $theme->num_ratings), number_format_i18n($theme->num_ratings));
    }
    wp_send_json_success($api);
}

WordPress Version: 3.9

/**
 * Get themes from themes_api().
 *
 * @since 3.9.0
 */
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' => $theme_field_defaults));
    $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 = self_admin_url('update.php?action=install-theme');
    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);
        $theme->name = wp_kses($theme->name, $themes_allowedtags);
        $theme->author = wp_kses($theme->author, $themes_allowedtags);
        $theme->version = wp_kses($theme->version, $themes_allowedtags);
        $theme->description = wp_kses($theme->description, $themes_allowedtags);
        $theme->num_ratings = sprintf(_n('(based on %s rating)', '(based on %s ratings)', $theme->num_ratings), number_format_i18n($theme->num_ratings));
    }
    wp_send_json_success($api);
}