web-dev-qa-db-fra.com

Catégoriser les thèmes par dossiers dans le backend

Je veux organiser des thèmes comme:

  1. wp-content/themes/themeshop/theme1
  2. wp-content/themes/themeshop/theme2
  3. wp-content/themes/themeshop/theme3

Si j'ai bien compris, cette organisation fonctionne parfaitement au niveau des dossiers. J'ai laissé des thèmes dans des sous-répertoires et tout semble bien fonctionner. Maintenant, est-il possible de dupliquer cette catégorisation dans le backend de l'administration sur la page des thèmes?

6
navjotjsingh

Version mise à jour du plugin disponible sur GitHub.

J'ai d'abord vu votre question dans la liste [wp-hackers] et, après avoir implémenté la solution, j'étais sur le point de publier un Q & R à ce sujet. Eh bien, il est déjà là et a une prime mise dessus :)

Comme Daniel Bachhuber indique dans le fil:

WordPress.com place des thèmes dans des sous-répertoires

/wp-content/themes/public 
/wp-content/themes/premium

Je suis venu avec cette solution pour montrer que dans le backend:

  • dans Multisite, nous pouvons ajouter une colonne dans l'écran des thèmes et afficher les informations avec manage_themes_custom_column et manage_themes-network_columns.

  • dans les installations à site unique, le seul point d'entrée que j'ai trouvé était dans theme_action_links.

<?php   
/**
 * Plugin Name: Theme Folders Categories
 * Plugin URI: http://wordpress.stackexchange.com/q/96361/12615
 * Version: 1.0
 * Author: Rodolfo Buaiz
 * Author URI: http://wordpress.stackexchange.com/users/12615/brasofilo
 * License: GPLv2 or later
 */
class WPhackersSE_Theme_Folders
{   
    public function __construct()
    {
        add_action( 'plugins_loaded', array( $this, 'start_up' ) );
    }    

    /**
     * Hooks for Network themes and Single Site themes
     * Nothing happens on sub-sites of a Network 
     */
    public function start_up()
    {
        if( is_network_admin() )
        {
            add_filter( 'manage_themes-network_columns', array( $this, 'column_register' ) );
            add_action( 'manage_themes_custom_column', array( $this, 'column_display' ), 10, 3 );
            add_action( 'admin_head-themes.php', array( $this, 'network_theme_category_css' ) );
        } 
        elseif( !is_multisite() )
        {
            add_filter( 'theme_action_links', array( $this, 'theme_folder_single_site' ), 10, 2 );
            add_action( 'admin_head-themes.php', array( $this, 'theme_category_css' ) );
        } 
    }

    /**
     * Add custom category (folder) column in network themes
     * 
     * @param array $columns
     * @return array
     */
    public function column_register( $columns ) 
    {
        $columns['theme_folder'] = 'Category';
        return $columns;
    }

    /**
     * Display custom row in network themes
     * $stylesheet contains a string "folder/theme_name"
     * $theme is a WP_Theme object
     * 
     * @param string $column_name
     * @param string $stylesheet 
     * @param object $theme 
     * @return string
     */
    public function column_display( $column_name, $stylesheet, $theme ) 
    {
        if( 'theme_folder' != $column_name  )
            return;

        echo $this->make_button( $stylesheet );
    }

    /**
     * Adjust column width and button style in Multisite screen
     */
    public function network_theme_category_css()
    {   
        echo "<style type='text/css'>
            #theme_folder { width: 10% }
            {$this->button_style()}
            </style>";
    }

    /**
     * Show theme category (folder) in single site theme action row
     * $theme is a WP_Theme object
     * 
     * @param array $actions
     * @param object $theme
     * @return array
     */
    public function theme_folder_single_site( $actions, $theme )
    {
        array_unshift( $actions, $this->make_button( $theme->stylesheet ) );
        return $actions;
    }

    /**
     * Adjust button style in Single site screen
     */
    public function theme_category_css()
    {   
        echo "<style type='text/css'>{$this->button_style()}</style>";
    }

    /**
     * Common button for Multi and Single sites
     * The category name is extracted from a string "folder/themefolder"
     * 
     * @param object $theme
     * @return string
     */
    private function make_button( $stylesheet )
    {
        $button_category = sprintf( 
            '<a href="javascript:void(0)" class="button-secondary theme-folder" title="%1$s">%1$s</a>',
            dirname( $stylesheet )
        );
        return $button_category;
    }

    /**
     * Common style for Multi and Single sites
     * 
     * @return string
     */
    private function button_style()
    {
        return '.theme-folder { 
            cursor: default !important;
            line-height: 15px !important;
            height: 17px !important;
            background-image: -webkit-gradient(linear, left top, left bottom, from(#DCFEDE), to(#CBEBCD)) !important;
            background-image: -webkit-linear-gradient(top, #DCFEDE, #CBEBCD) !important;
            background-image: -moz-linear-gradient(top, #DCFEDE, #CBEBCD) !important;
            background-image: -o-linear-gradient(top, #DCFEDE, #CBEBCD) !important;
            background-image: linear-gradient(to bottom, #DCFEDE, #CBEBCD) !important;
        }';
    }
}

new WPhackersSE_Theme_Folders;

Résultat dans multisite :
Dossiers /themes/clientes/ et /themes/brasofilo/). Il n'y a pas de sortie dans les sous-sites du réseau.

multisite theme categories

Il est probablement possible d'ajouter un filtre ici.


Résultat dans un seul site :
Multisite non activé. Dossiers /themes/defaults/ et /themes/others/.

single site theme categories

Cet écran est vraiment limité en termes de personnalisation. Je suis d'accord avec l'analyse de @ Ralf912.


Remarque importante : après avoir déplacé les thèmes actifs dans des sous-dossiers, tous les sites perdent leur configuration de thème, chaque thème de site doit être défini à nouveau .

9
brasofilo

Je pense que vous recherchez un crochet d'action ou un filtre pour exclure vos thèmes de la liste standard de thèmes et créer une liste supplémentaire représentant la structure de dossiers. Ou regrouper plus simplement les hemes en fonction du dossier dans lequel ils se trouvent.

Si vous ouvrez wp-admin/themes.php, vous verrez qu'il n'y a pas de hook ou filtre d'action. Il n’existe pas non plus de crochets d’action ni de filtres dans les fonctions utilisées ou dans la classe de liste (WP_Themes_List_Table) où vous pouvez modifier la liste de thèmes.

La seule chose que vous pouvez faire est de recoder le processus complet d'affichage des thèmes sur la page des thèmes et de remplacer le lien vers le themes.php dans le menu administrateur par votre propre script.

2
Ralf912