孫のテーマを作ることは可能ですか?


15

Genesisなどの一般的なフレームワークの1つを使用する場合、孫のテーマを作成できますか?

例として、すべてのサイトのバックボーンとしてGenesisを使用します。ジェネシスはフレームワークと呼ばれますが、実際には親テーマです。

次に、StudioPressで販売するジェネシスの子テーマの1つを選択し、サイトごとにカスタマイズし続けます。自分のすべてのサイトに孫のテーマを作成しますか?どのようにすればよいですか?

回答:


17

はいといいえ。

別の子テーマを親として指定して子テーマを作成すると、WordPressがそれを使用しようとします。

しかしながら

コア開発者がこれは望ましくない動作であると明示的に述べていることは言うまでもなく、問題にぶつかります。彼らは孫のテーマをサポートする努力をしません。

たとえば、WP APIはスタイルシートとテンプレートURL /ディレクトリを区別します。スタイルシートは常にアクティブなテーマを参照し、テンプレートは親テーマをget_template_directory_uri参照しますが、祖父母テーマが含まれている場合、親または祖父母を参照しますか?現在、多くのAPI呼び出しがあいまいであり、コアに含まれるコードを含め、さまざまな人々がさまざまな動作を期待しています。またfunctions.php、親または祖父母のいずれかをロードし、正しい順序で実行されることを確認する必要があります。

また、非常に悪い習慣と見なされます。孫のテーマが必要な場合は、アプローチが間違った方向に進んでいるので、一歩下がって物事を再評価する必要があります。

孫のテーマの概念を避けることをお勧めします、それはより多くの問題につながるでしょう。代わりに、より多くのフックが子テーマのアクションとモジュール性をフィルタリングすることで、子テーマの共有コンポーネントを同じ状態に保ち、分岐/分岐を簡単に行うことができます。一般的な要素をsvn external / gitサブモジュールに移動してみてください。

子/オーバーライドではなく、コピーで作業する意図を持つ親としてではなく、子テーマをベースにしてフォークする_sモデルもあります。


私の場合、Genesisを使用する場合、子テーマを直接修正する必要がありますか?Gitにはあまり馴染みがありませんが、元の子テーマをそのまま維持するのに役立つアプローチに興味があります。
urok93

はい、ここには多くのオプションがありません。
トムJノウェル

素晴らしい孫のテーマを作ろうとしたらどうなるのだろうか。
Chris_O

1
これが必要な場合、メソッドは間違った方向に進んだと言います。これに興味があるのは、WooCommerce Storefrontテーマを使用するようなシナリオが原因です。さまざまなものに合わせてカスタマイズされた子テーマをストアフロントに販売します。したがって、子テーマのいずれかを使用しているが、子テーマを更新しても上書きされないように独自の変更を行いたい場合はどうすればよいですか?
ドリューエンジェル

1
私は知りません、それが店頭テーマの構築方法の制限であり、その時点で子テーマをフォークすることを余儀なくされます
トムJノウェル

3

以下に説明する方法や、通常の「孫」テーマも完全にはテストしませんでしたが、template_includeフィルターの機能を提供しました。

    /*
    Plugin Name: Grandchild Themes
    Plugin URI: http://www.who-cares.com/
    Description: A concept for Grandchild themes Plugin
    Author: See Plugin URI
    Version: 0.0.0.0.1-Alpha
    */

    add_action('wp_head', 'grnd_chld_add_headers', 0);
    add_action('init', 'grnd_chld_add_css');

    // Load template if exists. 
function grandchild_template_include( $template ) {

    if ( file_exists( untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template ) ) )
        $template = untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template );

    return $template;
}

// This is the actual filter that we want .
add_filter( 'template_include', 'grandchild_template_include', 11 );

    function grnd_chld_add_headers () {
        wp_enqueue_style('my_grandchild_style');
    }

    function grnd_chld_add_css() {
        $stamp = @filemtime(plugin_dir_path(__FILE__).'/style.css'); // easy versioning
        wp_register_style ('my_grandchild_style', plugins_url('style.css', __FILE__).'', array(), $stamp);
    }

    // From here , what you got is like a normal functions.php.

同様の方法で、たとえばarchive_templateのようなより具体的なフィルターを試すこともできます

add_filter ('archive_template', create_function ('', 'return plugin_dir_path(__FILE__)."archive.php";'));

言ってやったことはすべて、それが物事を行う最良の方法であるかどうかはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.