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.
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
}
On dirait qu'il y a un nouveau crochet dans le bloc: extra_theme_headers
.
Mais il y a quelque chose de bizarre:
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;
}
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;
}`