Example #1
0
/**
 * 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);
}
Example #2
0
/**
 * 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);
}