web-dev-qa-db-ja.com

ファイルを子テーマに含め、functions.phpで宣言する

私は子供のテーマを使っています。現在存在しているファイルを変更したいのですが。

mybasetheme>インクルード> sf-content-display> sf-post-layouts.php

それで、まったく同じファイル構造を自分の子テーマにコピーし、そのファイルを次のファイルにコピーしました。

mychildtheme>インクルード> sf-content-display> sf-post-layouts.php

しかし、それはまだ基本テーマバージョンにデフォルトですか?

が含まれているのでそれがそれを呼び出すfunctions.phpファイルと関係があるかどうか疑問に思いました。そこで、私は子テーマに新しいfunctions.phpファイルを以下のように作成しました。

<?php

// Functions specific to child-theme

require_once( get_stylesheet_directory() . '/includes/sf-content-display/sf-post-formats.php' );

しかし今、私はそれが基本テーマfunctions.phpですでにそれを呼んでいるようには決して働かないであろうのを見ます:

>include(SF_INCLUDES_PATH . '/sf-content-display/sf-post-formats.php');

だから私はこのエラーが出ます:

/ Applications /にあるsf_get_post_media()(以前に/Applications/MAMP/htdocs/syyco/wp-content/themes/flexform-child/include/sf-content-display/sf-post-format.php:15で宣言されている)を再宣言できません36行目のMAMP/htdocs/syyco/wp-content/themes/flexform/includes/sf-content-display/sf-post-format.php

それで私は何をしますか?基本テーマを編集しない限り、子テーマに新しいファイルを含めることはできません。これは、子テーマを持つことの意味をまったく損なうことになります。

1
Francesca

テンプレートの階層構造になると、WordPressは実際にメインテーマからロードする前に子テーマディレクトリを調べます。

他のすべての非特定のWordPressファイル(機能やサードパーティーのインクルードなど)については、それらをどのようにロードするかを決めるのは完全にメインテーマです。

テーマがこれらのインクルードをロードするためにlocate_templateを使用しているのでない限り、またはスタイルシート(子テーマ)ディレクトリを最初にチェックしているのでなければ、子テーマでのファイルの上書きは効果がありません。

関数がif ( ! function_exists( ...でラップされている場合、作者は上書きすることを許可しています、そしてあなたは単にあなたの子供のテーマのfunctions.phpにあなた自身のバージョンの関数を書くことができます。

それに失敗したら、変更したいコードの周りにdo_action( ... )apply_filters( ... )がないか探してください - これがあなたの子テーマのデフォルトの振る舞いを無効にするための最後の呼び出しポートです(フックのコーデックス をチェックしてください )。

上記のいずれもオリジナルの作者によって実装されていない場合は、2つの選択肢のいずれかがあります。オリジナルのテーマを編集するか、作者に連絡して子テーマのAPIを実装するように要求します。

1
TheDeadMedic

簡単に説明すると、多くのテーマ作者(私もこれを行います)は、通常のfunctions.phpファイルの外側に、より小さく、扱いやすいファイルに機能を整理する傾向があります。それは特定の機能を見つけるのをより簡単にします、そしてそれはまたサイトに関する特定の側面に関連する機能をまとめてグループ化します

簡単な例:

私のテーマでは、comments-functions.phpというファイルがあります。このファイルには、私のテーマのコメントセクションに関連するすべての機能を追加します。

私が言ったように、これはすべて、一日の終わりに、特定の機能について2000行のコードを調べたいコードを編成するために行われます。

これらの小さな関数ファイルはすべてmain functions.phpに呼び出されて使用のために登録されます。

子テーマを作成するとき、このファイル構造を維持する必要はありません。子テーマのfunctions.phpに関数を追加/削除/変更するだけです。 1つの関数を持つ子テーマを作成するだけの場合は、単にfunctions.phpファイルを作成してそこに関数を追加してください。

子テーマのfunctions.phpは親の前にロードされるので、if(!function_exists('function_name'))条件タグでラップされているすべての関数は子テーマの中でコピーして変更することができます。この変更された関数は、親関数の名前を保持します。それがロードされることになっているとき、親関数は無視されます。これは、関数が再宣言できるONLYの時間です。つまり、2つの関数が同じ名前を持ちます。

親関数がラップされていない場合は、次の選択肢があります。

  • 関数がスタンドアロンの場合は、子テーマにコピーし、名前を変更して必要に応じて変更します。このタイプの関数はどこかにコールバックを持っているので、親テンプレートでその関数を探し、その特定のテンプレートをあなたの子テーマにコピーし、そして親関数名をあなたの新しい子関数で置き換えます。親関数を削除したり、親関数を使って何かをすることを心配する必要はありません。たとえば、親テーマの名前がparent_function()でindex.phpで呼び出されている場合は、index.phpを自分の子テーマにコピーし、parent_function()を自分の子関数に置き換えます。たとえば、child_function()と入力します。

  • 機能が特定のアクションまたはフィルタにフックされている場合は、登録された後にその機能を削除する必要があります。 アクションとフィルタの削除 を参照してください。新しい関数を登録して、親テーマがフックされていたのと同じフックにフックすることができます。覚えておいてください、ここで優先順位は非常に重要です、間違った順序を実行することは失敗するでしょう。

1
Pieter Goosen

編集したい機能だけを変更するだけです。この投稿を参照してください

1)親テーマから上書きしたい機能をコピーします。

2)子テーマのフォルダのルートにあるfunctions.phpに貼り付けます。 functions.phpが存在しない場合は作成してください。

3)関数の名前をparent_theme_functionからchild_theme_functionに変更します。

4)親機能を無効にします。

5)子機能を有効にします。

0
Shail