web-dev-qa-db-ja.com

必要なときだけwp_enqueue_style()とwp_enqueue_script()を使う方法?

私のプラグインはwp_enqueue_style()とwp_enqueue_script()を使用してリソースをロードしますが、私はユーザのパフォーマンスを低下させず、現在の投稿のセットに自分のプラグインのショートコードが含まれる場合にのみロードするようにしました。私はこれを使用して行います:

add_filter('the_posts', 'CrayonWP::the_posts');

the_postsはwp_headの前に呼び出されますが、その後数回呼び出されることもあります(おそらくウィジェットなどの最近の投稿用)。

ここでの問題は、私が自分のショートコードをポストのコンテンツで検索してエンキュープロセスを知らせるときに、次のような場合があることです。

  • the_postはwp_headの前に呼び出されます(私が欲しいもの)
  • しかし、その一連の投稿に私のショートコードはなく、エンキューもしていません。
  • 後で、the_postsをもう一度呼び出すとエンキューしようとしますが、遅すぎます。

Wp_headが呼び出される前にページに表示される内容を確認するための明確な方法はありますか。

編集:

素晴らしい記事: http://beerpla.net/2010/01/13/wordpress-plugin-development-how-to-include-css-and-javascript-conditionally-and-only-投稿時に必要なとき/

しかし、それは単一のページリクエストでthe_postsへの複数の呼び出しを考慮に入れません:(

編集2:

私が試したのは次のものを使うことです。

add_action('wp', 'CrayonWP::queue');

wpアクションはリクエストが完了した直後に一度だけ使われるので。

そしてこの関数の中に:

global $wp_query;
$posts = $wp_query->posts;

しかし、$ wp_query変数がループ上でどのように変化するのかわかりません。 _postsフィルタが何度も呼び出されている場合、ウィジェットが独自のリクエストに送信するにつれて元のクエリが変更されている可能性がありますか?現時点ではページに表示されていない可能性があるため、 "最近の投稿"の投稿でショートコードをチェックしたくないのは明らかです。それで、the_postsフィルタの代わりにwpアクションフックを使うことは、それが単一のページであろうとホームページであろうと、その与えられたページのために要求された投稿を含みますか?

3
Aram Kocharyan

私はそれをテストしていませんが、実行されているクエリが移入に使用されているクエリであることをテストするために is_main_query() (3.3で登場)を使用できます。 「ループ」 (しかし、それが新しいWP_Queryインスタンスをどのように処理するかはわかりません)。

コーデックスはそれがpre_get_postsで使用できると言っています、しかしそれが後のフックで呼び出すことができない理由を見ることができないコードを見ることができません(すなわちthe_posts) - それはすべて現在の問い合わせに対してグローバル$wp_the_queryをチェックすることです。

1
Stephen Harris