child_themeの前にparent_theme functions.phpをロードする方法は?


12

functions.php子テーマのfunctions.phpファイルを読み込む前に親テーマのファイルを読み込まなければならないという問題が発生しました。これは、セットアップと初期化手順に必要です。/wp_core_root/wp-settings.php(名前:)内のフックを確認しましたdo_action('setup_theme');

問題は、そこにフックする方法がわからないことです。最初に取得するファイルは子テーマのfunctions.phpものなので、機能しませんadd_action( 'setup_theme', 'my_init_function' );

編集:
a)プラグインはテーマよりも早く読み込まれるため、最初のクエリにもアクセスできることはわかっていますが、プラグインに依存したくありません。
b)wp-settings.phpファイルのコード(短縮版)を以下に示します

// happens a lot earlier:  
do_action( 'plugins_loaded' );

// localize stuff happening here
    do_action( 'setup_theme' );

        // Load the functions for the active theme, for both parent and child theme if applicable.
        if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
            include( STYLESHEETPATH . '/functions.php' );
        if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );
    // first available hook, *after* functions.php was loaded
    do_action( 'after_setup_theme' );

私は2つのことを避けたいです:最初にユーザーへの多くの説明。次に、親が初期化手順を誤って削除してロープが切断されると、誰かが何かを壊す可能性があります。人々は、知らないうちに何かを壊す危険を冒すことなく、functions.phpの内部でプレイするだけです。

言い換えれば、どうすれば子テーマのfunctions.phpファイルをクリーンに保ちながら、親テーマのブートストラップを実行させるのですか?

何か案は?どうもありがとう!


あなたはそれを単に含めることはできませんか?
wyrfel

私の質問は:どこから?テーマコンテキストで読み込まれる最初のファイルは、子テーマのfunctions.phpです。wp-settings.phpコアの「molto loko」ファイルを見てみましょう(行:275-279 @wp 3.1 rc)...のように見えるif ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) include( STYLESHEETPATH . '/functions.php' ); if ( file_exists( TEMPLATEPATH . '/functions.php' ) ) include( TEMPLATEPATH . '/functions.php' );ので、チャンスを見ることができません...そして、使用したくありません私のテーマをブートストラップするプラグイン。
カイザー

ここで何かが完全に欠落している可能性がinclude(/path/to/parent/themes/functions.php)ありますが、子テーマのfunctions.phpの上部に挿入すると、その中のすべてが前にロードされます。ない?
wyrfel

@wyrfel:私はそれをより明確にするためにQを更新しました
kaiser

わかりました。おかげで、今ではもっとはっきりしています。さらに、私はあなたが単一のインストールのためにこれをやっていると仮定しました。
wyrfel

回答:


11

Justin Tadlockは最近 、(私が正しく覚えていれば)この正確な問題を扱っているより良いfunctions.phpファイルの作成について素晴らしい投稿を書いています

残念ながら彼のサイトは現在ダウンしているので、今のところ私の記憶に頼らなければなりません。

あなたはafter_setup_themeフックで正しい軌道に乗っています。

  1. 私が覚えている限り、トリックは、フィルターとアクションをその関数にラップすることです。
    以下の例を参照してください。
  2. あなたにはそれを行うの両方の親と子functions.phpのファイル。
  3. その後、これらの2つのフックの優先度でプレイできます。

1000ワードに相当する少しのコード-親テーマは次のfunction.phpようになります。

add_action( 'after_setup_theme', 'your_parent_theme_setup', 9 );
function your_parent_theme_setup() {    
    add_action(admin_init, your_admin_init);
    add_filter(the_content, your_content_filter);
}

function your_admin_init () {
...
}

function your_content_filter() {
...
}

ええと、書き込み(+1)に感謝します。あなたは印象的な脳を得ました;)。after_setup_themefunctions.phpファイルがすでにロードされているため、問題は遅すぎます。
カイザー

編集:コードを再考し、「親と子の両方のfunctions.phpでそれを行う」と「優先順位で遊ぶ」を読んだ後、理にかなっています。ユーザーが簡単に破ることができないより良いソリューションを探していますが、それは理にかなっています!ありがとう!
カイザー

ここには実際の解決策はないので、あなたがこれを最初に提案したので、これにチェックマークを付けます。
カイザー

9

まず、できません。子テーマのfunctions.phpは常に最初にロードされます。

次に、テーマはsetup_themeにフックできません。プラグインはできますが、テーマが最初にフックできるのはafter_setup_themeです。

親が正しく設計されている場合、子は最初にロードされたときにのみ、親の関数やものをオーバーライドできます。

大まかに言えば、最初に親のfunctionsファイルをロードする必要があると思う場合は、おそらくそれが間違っていると思われます。より大きな問題を説明する必要があります。


ご回答有難うございます。私はテーマの前にプラグインをロードする必要性を理解し、その事実をすでに認識しています(上記を読んで:「テーマをブートストラップするためにプラグインを使用したくありません。」)。私のケースを詳しく説明すると、フレームワークのすべてのパーツをロードすることに関心のあるiniファイルを取得しました。これは、ファイルを要求し、initクラスをロードする親テーマ関数phpから始まります。InitClassは、a)と子テーマの.iniファイルからのデータの配列をロードし、それを別のクラスにプッシュして、exをさらに処理します。メタボックス、カスタム投稿タイプなど
カイザー

私の問題は、親のfunctions.phpファイルからこれらすべてを初期化する必要があるため、通常のユーザーが子テーマ内で遊んでいるときにファイルを壊すことができないということです。私の2番目の問題は、これらのクラスのすべてが子テーマのfunctions.phpファイル内で利用できないため、役に立たないということです...しかし、おそらくここで大きな思考エラーが発生しました。それをより良くする方法に関するアイデアや提案はありますか?
カイザー

3
....ユーザーが物事を壊した場合、それが本当に彼らの問題であるという事実を受け入れる必要があるだけだと思います。結論:最初に親テーマのfunctions.phpをロードし、子テーマを「クリーン」のままにする方法はありません。親テーマのfunctions.phpファイルがロードされた後に子テーマに何かを実行する必要がある場合は、それをafter_setup_themeにフックされた関数内に配置します。これは、両方のfunctions.phpファイルが読み込まれた後に実行されます。
オットー

OK。それはそれほど大きな問題ではありません。可能性があれば私はただ興味がある。質問:「塩分に値するフレームワーク」は、initプロシージャの後にフックがあり、単にafter_setup_themeフックを使用しないのはなぜですか?フックを「スパム」しないため、またはそれがより「エンタープライズ」または「クール」なためか?つまり、テーマ固有の並列フックの背後にある「ベストプラクティス」のアイデアは「プラグインのコアフックを残す」ですか?(それが私が現在それを処理する方法です。)
カイザー

「そうするつもりなら、余分なアクションを気にしないでください。単にafter_setup_themeにフックするだけです。」OK。ありがとう。+1
カイザー

4

つまり、子のfunctions.phpからコードを実行しようとしていますが、親テーマがロードされた後です。シンプルで、カスタムアクションを使用するだけです。

の終わりにparent/functions.php

do_action('parent_loaded');

child/functions.php

function parent_loaded() {
    // do init stuff
}
add_action('parent_loaded', 'parent_loaded');

塩の価値があるすべての親テーマは、この方法で行います。さらに、子テーマで使用するために他のいくつかのアクションとフィルターが散在しています。


私はできるだけ多くの指示を避けようとします。これが、子テーマフォルダーのconfig.phpファイルから切り替えて、代わりにiniファイルを使用する理由の1つです。一言で言えば、私は自分の古いソリューションから離れて、コアとコーデックスにできるだけ近づくことを試みます。私の問題は、子テーマから単一の関数を提供できないことです。これは、子テーマのfunctions.phpファイル内で、クラスやブートストラップから利用できるクラスがないためです(カスタム/フレームワークテンプレートタグについての話ではありません)。
カイザー

更新された回答を参照してください。
scribu

Qも更新しました。2/3の回答が同じソース(テーマ、編集前)を指すことを読んだ後、「ジャスティンタドロック」を含める方法しかないように感じますが、確認したいと思います。
カイザー、

2
それをするつもりなら、余分なアクションを気にしないでください。after_setup_themeにフックするだけです。
オットー

0

次のように、親テーマのfunctions.phpファイルを子テーマのfunctions.phpファイルに含めてみませんか。

子テーマのfunctions.phpファイルで:

if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );

// code of child theme's functions.php file continues here

このようにして、親テーマのfunctions.phpファイルは変更されません(これが重要になる場合があります)。


Qで述べたように、「言い換えると、子テーマのfunctions.phpファイルをクリーンな状態に保つために、親テーマのブートストラップを実行するにはどうすればよいですか?」さらに良い:functions.phpファイル内からの呼び出しを回避するにはどうすればよいですか?理由:ユーザーは、そこにあるテンプレートファイルに含めたくないすべてのがらくたを破壊するのに慣れています。したがって、誰かが誤って一部の行を削除してしまう可能性が高くなります。私の経験:コメント、readme、ドキュメントを実際に読む人はいません。
カイザー

0

以前に同様の問題があり、親で余分な空の「child-functions.php」を作成し、子で使用するファイル/関数の直後に「functions.php」(親も)に含めることで修正しました。次に、子のテーマで「child-functions.php」ファイルを作成し、親がエレガントなソリューションではないが、仕事をした後に実行される子functions.phpのシミュレーションを開始できる場所があります。

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