web-dev-qa-db-fra.com

Masquer un thème sur une liste de thèmes dans wp-admin sans modifier les fichiers core

Je gère un réseau multisite avec plus de 200 thèmes installés et activés. Existe-t-il un moyen de manipuler la liste des thèmes disponibles dans wp-admin afin que certains thèmes n'apparaissent pas dans la liste ? Je veux le faire sans éditer les fichiers de base.

Je sais que WordPress obtient la liste des thèmes disponibles à partir de la fonction get_themes(). Et qu’il existe une fonction appelée get_allowed_themes() qui pourrait être la solution. Mais aucune idée sur la façon de l'utiliser.

3
grosshat

Le filtre suivant fonctionne dansMultisitedans les écrans suivants:

  • /wp-admin/network/themes.php
  • /wp-admin/network/site-themes.php?id=1 (sites individuels autorisés thèmes)
add_filter( 'all_themes', 'wpse_55081_remove_themes_ms' );
function wpse_55081_remove_themes_ms($themes)
{
    unset($themes['Twenty Ten'], $themes['Twenty Eleven']);
    return $themes;
}

Pour le sélecteur de thème standard dans unsite uniqueousous-site d'un réseau/wp-admin/themes.php (Apparence -> Thèmes), on dirait qu'il n'y a pas de hook ...

J'ai trouvé que $wp_themes global var contient le tableau avec tous les thèmes, mais je n'ai pas réussi à en supprimer les éléments ...

La vieille ruse jQuery fait le travail, mais la pagination peut devenir funny ...

add_action( 'admin_head-themes.php', 'wpse_55081_remove_themes' );

function wpse_55081_remove_themes()
{
    ?>
    <script type="text/javascript">
    jQuery(document).ready( function($) {
        $('div.available-theme:contains("comicpress")').remove();
        $('div.available-theme:contains("twentyten")').remove();
        $('div.available-theme:contains("starkers")').remove();
    });     
    </script>
    <?php
}

Mettre à jour

On dirait qu'il y a un nouveau crochet dans le bloc: extra_theme_headers.
Mais il y a quelque chose de bizarre:

  • c'est documenté en tant que nouveau filtre dans WP 3.4
  • mais il apparaît dans wp-includes/deprecated.php (?!)
/*
 * The returning $arr is always empty, but we are able to unset items in the global $wp_themes
 * Works in all theme screens, Multisite or Single Site (and doesn't bugs pagination)
 * 
 * It is defined this way: apply_filters( 'extra_theme_headers', array() )
 * The array value is always empty but, if we return it, the filter doesn't works..
 *
 */
add_filter( 'extra_theme_headers', 'wpse_55081_remove_themes_everywhere', 10, 1 );

function wpse_55081_remove_themes_everywhere($arr)
{
    global $wp_themes;
    unset($wp_themes['Convertible/Convertible'], $wp_themes['grido-child'], $wp_themes['ilost'], $wp_themes['parallels'], $wp_themes['twentyeleven']);
    // return $arr;
}
4
brasofilo
add_filter( 'wp_prepare_themes_for_js', 'hideThemes');
function hideThemes($arr){
    foreach($arr as $key => &$value){
        //unset what you want
    }
    return $arr;
}`

Ou bien:

add_filter( 'wp_prepare_themes_for_js', 'hideThemes');
function hideThemes($arr){

    unset($arr["twentyfourteen"]);
    unset($arr["twentythirteen"]);
    unset($arr["twentytwelve"]);

    return $arr;
}`
4
Ruben