Codexメソッドの変更により、親と子のテーマスタイルシートのエンキューに関する問題


9

この投稿は、このスレッドこのスレッドで持ち込まれたスタイルシートのエンキューメソッドに関する最近の変更に関して私が遭遇したいくつかの質問を持ち出します

私が遭遇した問題は、WP 4.0のインストールで特に子テーマに対応している、広く使用され維持されている親テーマを使用して、一般的なユースケースシナリオで発生しました。私の子テーマのfunctions.phpには、Codexに詳述されている関数のみが含まれていwp_enqueue_styleます。

以下で参照するコードはこのテーマに固有のものですが、その多くは親テーマで使用されている現在のコーディング規則を使用しています。さらに、私の関心領域は、現在広く普及している多数の確立された親テーマで重複している可能性が高いです。また、これらの提起された質問は、どの親テーマが使用されているかに関係なく、普遍的なレベルで適用できます。

問題1:Twoqueueing

推奨セットアップ:

親テーマは、wp_enqueue_scriptsフックを使用してスタイルとスクリプトをキューに入れることです。関連する部分は次のとおりです。

add_action('wp_enqueue_scripts', 'parent_theme_function_name');
function parent_theme_function_name() {
    wp_register_style( 'avia-style' ,  $child_theme_url."/style.css", array(),  '2', 'all' );
    wp_enqueue_style( 'avia-base');
    if($child_theme_url !=  $template_url) { wp_enqueue_style( 'avia-style'); }
}

私の子テーマfunctions.phpは、最近のコーデックスの変更ごとにスタイルをエンキューします。

add_action( 'wp_enqueue_scripts', 'enqueue_parent_theme_style' );
function enqueue_parent_theme_style() {
    wp_enqueue_style( 'dm-parent-style', get_template_directory_uri().'/style.css' );
}

参照コードで使用されている次のIDに注意してください。

  • id='dm-parent-style-css' 子テーマ関数によってエンキューされた親テーマのスタイルシートです
  • id='avia-style-css' 親テーマ関数によってエンキューされた、私の子テーマのスタイルシートです
  • id='dm-child-style-css' 私の子テーマの関数によってエンキューされた、私の子テーマのスタイルシートです

結果:

一見すると、<head>は次の順序で表示され、すべて順調でした。

<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />
<!-- Multiple individual parent theme styles here -->
<link rel='stylesheet' id='avia-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />

プラグインをインストールした後、エンキューの順序が次のように変更されました。

<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />
<!-- Multiple individual parent theme styles here -->
<link rel='stylesheet' id='avia-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />
<!-- Pesky plugin styles -->

最終的に、プラグインの後に子テーマのcssをロードする必要があるため、子テーマの関数に優先番号を追加する必要がありました(優先番号に関する前述の説明を参照)

ただし、私の関数は親テーマのcssのみをエンキューするため、結果として、親テーマの cssが最後に移動し、子テーマのcssが以前よりもさらに悪い状況に置かれます。

<!-- Multiple individual parent theme styles here -->
<link rel='stylesheet' id='avia-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />
<!-- Pesky plugin styles -->
<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />

ここで、子テーマスタイルのエンキューにも頼らなければなりません。これは、それが行の先頭に戻されることを確実にするために、前述の2つのキューイング(新しい用語?lol)の子テーマcssの問題を引き起こします。

非推奨のセットアップ:

子テーマの改訂された機能:

add_action( 'wp_enqueue_scripts', 'enqueue_parent_theme_style', 99 );
function enqueue_parent_theme_style() {
    wp_enqueue_style( 'dm-parent-style', get_template_directory_uri().'/style.css' );
    wp_enqueue_style( 'dm-child-style', get_stylesheet_directory_uri().'/style.css' );
}

結果:

で次の順序を生成します<head>

<!-- Multiple individual parent theme styles here -->
<link rel='stylesheet' id='avia-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />
<!-- Pesky plugin styles -->
<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />
<link rel='stylesheet' id='dm-child-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />

子スタイルシートを関数に含めると2回キューに入れられましたが、親テーマが子スタイルシートを適切にキューに入れるという前提の下でコーディングよりもIMHOの方が適しています。エンキューされた各スタイルに割り当てられたIDに基づいて、WP Coreの何もではなく、親テーマがエンキューしたように見えます。

私のShivm:

これが推奨される手段であることはほとんどお勧めしませんが(そして、私がこのソリューションでうめき声よりも多くのコーディング経験を持つ開発者は確実に)、自分のエンキューのすぐ上に親テーマのID(子テーマのスタイルのエンキューに使用されます)をデキューしました次のように私の子テーマの関数ファイルで:

add_action( 'wp_enqueue_scripts', 'enqueue_parent_theme_style', 99 );
function enqueue_parent_theme_style() {
    wp_enqueue_style( 'dm-parent-style', get_template_directory_uri().'/style.css' );
    wp_dequeue_style( 'avia-style' );
    wp_enqueue_style( 'dm-child-style', get_stylesheet_directory_uri().'/style.css' );
}

結果:

これにより問題が解決され、次の結果が得られました。

<!-- Multiple individual parent theme styles here -->
<!-- Plugin styles -->
<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />
<link rel='stylesheet' id='dm-child-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />

もちろん、これには親テーマで使用されるIDを知る必要がありました。標準の子テーマ開発方法論として使用するには、より一般的なものが必要になります。

問題2:再配置された子スタイルシート

(これが別のスレッドで出て来なかったとは信じられないようですが、探しているときに特定のスレッドが表示されませんでした...見逃した場合は、遠慮なくお知らせください。)

私は決してデフォルトを使用しないstyle.cssことが明らかに存在しなければならないが、すべて私の実際のスタイルは/ CSS /ディレクトリ内の.css縮小さファイルとしてSCSSからコンパイルされている-私のテーマスタイルの子テーマのルートディレクトリに。これは、子供向けテーマ開発の普遍的なレベルでは「期待される基準」ではないことに気づきましたが、私が知っている最も深刻なWordPress開発者は同様のことをしています。もちろん、これは、親テーマがスタイルシートをエンキューしたかどうかに関係なく、自分の関数でそのスタイルシートを手動でエンキューする必要があります。

まとめると...

  1. 子テーマの標準の観点から、親テーマが子テーマスタイルを適切にエンキューするという仮定を含めることは安全ですか?
  2. 優先順位を削除すると、WordPressコミュニティの一部で混乱が生じる可能性があります。子テーマスタイルがプラグインによって上書きされ始める場合です。私たちはテーマがスタイルを上書きすることを期待していますが、プラグインではそれほどではありません。
  3. 実際の子テーマスタイルにカスタムスタイルシートを使用する場合(事前定義されたにstyle.css配置することになっています)、そのファイルを手動でキューに入れる必要があります。幅広い開発者に渡って継続性を維持するという点では、重複の可能性に関係なく、子スタイルシートを手動でエンキューすることを奨励することは理にかなっていますか?

子供と親とテーマの関係をどのように構築するかについては、議論があると思います。親テーマについて何でも想定するのは安全ではないと思います。個人的には、子テーマのスタイルを手動でロードすることを好みます。ただし、これらは、子テーマの性質について行い、それを明確に伝えるために必要な決定です。子テーマが単純な視覚的微調整のためだけである場合、親が子のスタイルシートをロードすることはおそらく問題ありません。しかし、親テーマがフレームワークである場合は、スタイルシートをロードする子テーマに進みます。
Seamus Leahy 2014年

回答:


5

質問1

子テーマの標準の観点から、親テーマが子テーマスタイルを適切にエンキューするという仮定を含めることは安全ですか?

原則として、そうです。しかし決して想定すべきではありません。ライブでのほとんどの災害と障害は、仮定または仮定に基づく事実が原因です

仮定なしの事実

  • 子テーマのfunctions.phpが最初にロードされ、次に親のfunctions.phpがロードされます。これにより、親テーマのメインスタイルシートが、コーデックスの更新されたコードから子テーマのメインスタイルシートの前に読み込まれるようになります。

  • バンドルされているテーマ、twenty12を見てみましょう。ここで魔法が起こりますwp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() );。これがメインのスタイルシートがキューに入れられる方法です。テーマが親テーマとしてアクティブな場合、style.cssはget_stylesheet_uri()、親ディレクトリのstyle.cssを指すように、親テーマからロードされます。

  • 子テーマに切り替えると、get_stylesheet_uri()パスが「変更」されて子テーマのstyle.cssを指すようになります。つまりwp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() );、親style.css をロードする代わりに、子style.cssをロードするようになりました。

  • 親テーマからの他のすべてのスタイルは、通常どおり、記述された順に読み込まれます

POTHOLES

  • ヘッダーテンプレートに直接追加されるインラインスタイルとスタイルシート。この問題についていくつかのテストを行いました。親スタイルシートがを使用wp_enqueue_scriptsしてエンキューされておらず、ヘッダーに直接読み込まれていない場合、子テーマのメインスタイルシートが最初に読み込まれます。ここでの回避策として、私は以前、親のheader.phpを子テーマにコピーし、それらの呼び出しを削除することをお勧めしました。次に、親と子の両方のテーマスタイルと、OP 減価償却関数で説明されているようにheader.phpに直接ロードされたその他のスタイルシートの両方をエンキューする必要があります。

  • 私はこれに1、2回遭遇しましたが、スタイル(およびスクリプト)がヘッダーに直接読み込まwp_headれます。このため、への呼び出しは省略されています。これにより、エンキューアクションがサイレントに失敗するため、スタイルが表示されなくなります。

  • 間違った優先順位が設定されています。エンキュー機能をフックするときに、優先順位を親アクションと子アクションのどちらかに設定する必要はありません。両方のデフォルトの優先度が同じ場合、先着順のルールが適用されます。これにより、読み込み順序が正しいことが保証されます

親の作者への注意

スタイルとスクリプトをテーマに追加するための適切に受け入れられている方法は、wp_enqueue_scriptsアクションフックを使用することです。決してヘッダーテンプレートに直接スタイルとスクリプトを追加しないと、あなたの関数をフックするとき、あなたのアクションのいずれかの優先順位を設定しないでください

次のように、常にメインスタイルシートもロードします。

wp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() );

これにより、子テーマが使用されているときに子のメインスタイルシートが確実に読み込まれます。

子供のテーマ作者としてのあなたの責任

  • 時間をかけて親のテーマに取り組みます。親テーマを理解し、テーマの構造と、テーマでの関数とフックの使用方法に慣れていることを確認してください。親テーマがどのように機能するかについての内部知識がないと、成功する子テーマを作成できません。コードが期待どおりに機能するためには、スタイルとスクリプトが適切に読み込まれていることを確認する必要があります。

  • 親テーマの作成者に、満足できないコードがある場合は常に警告するようにしてください。たとえば、作者が自分のスタイルをヘッダーに直接追加した場合は、そのことを警告し、これが間違った方法であることを知らせ、将来のリリースでこれを修正するように依頼します。

質問2

優先順位を削除すると、WordPressコミュニティの一部で混乱が生じる可能性があります。子テーマスタイルがプラグインによって上書きされ始める場合です。私たちはテーマがスタイルを上書きすることを期待していますが、プラグインではそれほどではありません

残念ながら、これを防ぐための直接的な方法はありません。ここでの事実は、プラグインスタイルは、エンドユーザーの同意なしにデフォルトのテーマスタイルを上書きしてはならないということです。私の意見では、これは単に悪い習慣であるか、プラグイン作成者からの否定です。このような場合は、プラグインの作者に連絡して、これについて警告することをお勧めします

また、必要のないスタイル(およびスクリプト)をデキューおよび登録解除するオプション、または上記のコードのように優先順位を変更して再キューイングおよび再登録する必要があるオプション(常に問題ありません)も常にあります。shivmに関するメモですが、スタイルとスクリプトのデキュー登録解除行うことがベストプラクティスです。

質問3

実際の子テーマスタイルにカスタムスタイルシートを使用する場合(事前に定義されたstyle.cssに配置することを想定)、そのファイルを手動でエンキューする必要があります。幅広い開発者に渡って継続性を維持するという点では、重複の可能性に関係なく、子スタイルシートを手動でエンキューすることを奨励することは理にかなっていますか?

この問題に対する直接的な白黒の答えはないと思います。私は、その行動を管理する特定のガイドラインの範囲内である限り、あなたが快適にできることを行うと言って答えます。

スタイルシートは機能を追加するためのものではなく、ユーザーに視覚的なエクスペリエンスを追加するためのものです。スタイルは、処理された状態でそのままブラウザに直接送信されます。Wordpressはここでは何の役割も果たしません。

この事実に基づいて、スタイルシートを2回ロードする際に、脅迫的な赤信号は実際にはありません。ただし、パフォーマンスは数ミリ秒かかる場合があります。正直なところ、これとは別に、異なるブラウザ間で重複がどのように処理されるのか本当にわかりません。これは、読者がテストできるものです。

私見、重複は決して良いものではなく、常に避けられるべきです。何らかの理由で子のメインスタイルシートを手動でエンキューしたい場合は、shivmでコードを使用することをお勧めします。デフォルトで追加された複製をデキューして登録解除し、通常どおりにスタイルシートを再キューイングします。

同様に覚えておくべきことの1つは、エンキュー関数と登録関数には、$dependancy使用できるパラメーターがあります。したがって、セカンダリスタイルシートをロードして、子テーマのメインスタイルシートに依存させるのは簡単です。

結論として

コーデックスの最近の更新以来、フィードバックは素晴らしいものであり、私はこれについて皆のフィードバックに感謝したいと思います。特にこの質問へのフィードバックには、どのような種類の参加者も参加することをお勧めします。何か追加やコメントがある場合は、どうぞ。


ピーター、あなたの徹底した返事をありがとう。今日は水に浸かっていますが、あなたが言ったことに基づいて、今晩後で付け加えたいと思います。
dMcClintock 2014年

そうしてください。私は本当にこれについて他の考えを聞きたいです。私の答えは私のテストに基づいた私の意見なので、これは確かにアルファやオメガではありません。あなたの洞察を楽しみにしています:-)
Pieter Goosen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.