/** * Prepare themes for JavaScript. * * @since 3.8.0 * * @param array $themes Optional. Array of WP_Theme objects to prepare. * Defaults to all allowed themes. * * @return array An associative array of theme data, sorted by name. */ function wp_prepare_themes_for_js($themes = null) { $current_theme = get_stylesheet(); /** * Filter theme data before it is prepared for JavaScript. * * Passing a non-empty array will result in wp_prepare_themes_for_js() returning * early with that value instead. * * @since 4.2.0 * * @param array $prepared_themes An associative array of theme data. Default empty array. * @param null|array $themes An array of WP_Theme objects to prepare, if any. * @param string $current_theme The current theme slug. */ $prepared_themes = (array) apply_filters('pre_prepare_themes_for_js', array(), $themes, $current_theme); if (!empty($prepared_themes)) { return $prepared_themes; } // Make sure the current theme is listed first. $prepared_themes[$current_theme] = array(); if (null === $themes) { $themes = wp_get_themes(array('allowed' => true)); if (!isset($themes[$current_theme])) { $themes[$current_theme] = wp_get_theme(); } } $updates = array(); if (current_user_can('update_themes')) { $updates_transient = get_site_transient('update_themes'); if (isset($updates_transient->response)) { $updates = $updates_transient->response; } } WP_Theme::sort_by_name($themes); $parents = array(); /** @type WP_Theme $theme */ foreach ($themes as $theme) { $slug = $theme->get_stylesheet(); $encoded_slug = urlencode($slug); $parent = false; if ($theme->parent()) { $parent = $theme->parent()->display('Name'); $parents[$slug] = $theme->parent()->get_stylesheet(); } $prepared_themes[$slug] = array('id' => $slug, 'name' => $theme->display('Name'), 'screenshot' => array($theme->get_screenshot()), 'description' => $theme->display('Description'), 'author' => $theme->display('Author', false, true), 'authorAndUri' => $theme->display('Author'), 'version' => $theme->display('Version'), 'tags' => $theme->display('Tags'), 'parent' => $parent, 'active' => $slug === $current_theme, 'hasUpdate' => isset($updates[$slug]), 'update' => get_theme_update_available($theme), 'actions' => array('activate' => current_user_can('switch_themes') ? wp_nonce_url(admin_url('themes.php?action=activate&stylesheet=' . $encoded_slug), 'switch-theme_' . $slug) : null, 'customize' => current_user_can('edit_theme_options') && current_user_can('customize') ? wp_customize_url($slug) : null, 'preview' => add_query_arg(array('preview' => 1, 'template' => urlencode($theme->get_template()), 'stylesheet' => urlencode($slug), 'preview_iframe' => true, 'TB_iframe' => true), home_url('/')), 'delete' => current_user_can('delete_themes') ? wp_nonce_url(admin_url('themes.php?action=delete&stylesheet=' . $encoded_slug), 'delete-theme_' . $slug) : null)); } // Remove 'delete' action if theme has an active child if (!empty($parents) && array_key_exists($current_theme, $parents)) { unset($prepared_themes[$parents[$current_theme]]['actions']['delete']); } /** * Filter the themes prepared for JavaScript, for themes.php. * * Could be useful for changing the order, which is by name by default. * * @since 3.8.0 * * @param array $prepared_themes Array of themes. */ $prepared_themes = apply_filters('wp_prepare_themes_for_js', $prepared_themes); $prepared_themes = array_values($prepared_themes); return array_filter($prepared_themes); }
/** * Prepare themes for JavaScript. * * @since 3.8.0 * * @param array $themes Optional. Array of WP_Theme objects to prepare. * Defaults to all allowed themes. * * @return array An associative array of theme data, sorted by name. */ function wp_prepare_themes_for_js($themes = null) { $current_theme = get_stylesheet(); // Make sure the current theme is listed first. $prepared_themes = array($current_theme => array()); if (null === $themes) { $themes = wp_get_themes(array('allowed' => true)); if (!isset($themes[$current_theme])) { $themes[$current_theme] = wp_get_theme(); } } $updates = array(); if (current_user_can('update_themes')) { $updates_transient = get_site_transient('update_themes'); if (isset($updates_transient->response)) { $updates = $updates_transient->response; } } WP_Theme::sort_by_name($themes); foreach ($themes as $theme) { $parent = false; if ($theme->parent()) { $parent = $theme->parent()->display('Name'); } $slug = $theme->get_stylesheet(); $encoded_slug = urlencode($slug); $prepared_themes[$slug] = array('id' => $slug, 'name' => $theme->display('Name'), 'screenshot' => array($theme->get_screenshot()), 'description' => $theme->display('Description'), 'author' => $theme->display('Author', false, true), 'authorAndUri' => $theme->display('Author'), 'version' => $theme->display('Version'), 'tags' => $theme->display('Tags'), 'parent' => $parent, 'active' => $slug === $current_theme, 'hasUpdate' => isset($updates[$slug]), 'update' => get_theme_update_available($theme), 'actions' => array('activate' => current_user_can('switch_themes') ? wp_nonce_url(admin_url('themes.php?action=activate&stylesheet=' . $encoded_slug), 'switch-theme_' . $slug) : null, 'customize' => current_user_can('edit_theme_options') && current_user_can('customize') ? wp_customize_url($slug) : null, 'preview' => add_query_arg(array('preview' => 1, 'template' => urlencode($theme->get_template()), 'stylesheet' => urlencode($slug), 'preview_iframe' => true, 'TB_iframe' => true), home_url('/')), 'delete' => current_user_can('delete_themes') ? wp_nonce_url(admin_url('themes.php?action=delete&stylesheet=' . $encoded_slug), 'delete-theme_' . $slug) : null)); } /** * Filter the themes prepared for JavaScript, for themes.php. * * Could be useful for changing the order, which is by name by default. * * @since 3.8.0 * * @param array $prepared_themes Array of themes. */ $prepared_themes = apply_filters('wp_prepare_themes_for_js', $prepared_themes); return array_values($prepared_themes); }