web-dev-qa-db-ja.com

バックエンドのフォルダでテーマを分類する

私はテーマを整理したい:

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

私の理解では、この組織はフォルダレベルで完璧に機能します。私はサブディレクトリにテーマを落としました、そして、すべてはうまくいくようです。テーマページの管理バックエンドでこの分類を複製することは可能ですか?

6
navjotjsingh

GitHubで入手可能な最新のプラグインバージョン。

私は最初に [wp-hackers]リスト であなたの質問を見ました、そして、解決策を実行した後に、それに関するQ&Aを公表しようとしていました。さて、それはすでにここにあり、それに恩恵を与えています:)

As Daniel Bachhuber がスレッドで指摘しているように:

WordPress.comはテーマをサブディレクトリの中に置きます

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

私はこの解決策を思いついたので、バックエンドでそれを示しました:

  • multisiteでは、Themesの画面に列を追加して、情報をmanage_themes_custom_columnmanage_themes-network_columnsで表示できます。

  • 単一サイトのインストールでは、私が見つけたエントリポイントは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;

マルチサイトの結果:
フォルダ/themes/clientes/および/themes/brasofilo/)。ネットワークのサブサイトには出力がありません。

multisite theme categories

たぶんここにフィルタを追加することは可能です。


単一のサイトになります
マルチサイトが有効になっていません。フォルダ/themes/defaults/および/themes/others/

single site theme categories

この画面はカスタマイズの点で本当に制限されています。 @ Ralf912の分析に同意します。


重要な注意:アクティブなテーマをサブフォルダに移動すると、すべてのサイトのテーマ設定が失われます。各サイトテーマを再設定する必要があります

9
brasofilo

テーマの標準リストからテーマを除外し、フォルダー構造を表す追加のリストを作成するためのアクションフックまたはフィルターを探していると思います。または、それらが入っているフォルダーごとにヘムを単純にグループ化する。

wp-admin/themes.phpを開くと、アクションフックやフィルタがないことがわかります。テーマのリストを変更できる、使用される関数やリストクラス(WP_Themes_List_Table)には、アクションフックやフィルタもありません。

あなたができる唯一のことはテーマページにテーマを表示する完全なプロセスを書き換えて、あなた自身のスクリプトに管理者メニューのthemes.phpへのリンクを取り替えることです。

2
Ralf912