フィルタとフックは実際にWordPressでどのように機能しますか?
進んだものについて質問しています。 PHPではどのように実装されていますか?たとえば、どのようにしてさまざまなプラグインからすべてのフックを収集し、それらをコアフックなどに「アタッチ」するか.
基本的に、FiltersとHooksを呼び出す " Plugin API "は、以下の関数で構成されています。
apply_filters()
- 実行 do_action
- 実行 apply_filters_ref_array()
- 実行 do_action_ref_array()
- 実行 add_filter()
- スタックに追加 add_action()
- スタックに追加 全体的には、いくつかのグローバル(WordPressの世界では他にもあります)が関係しています。
global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;
最初のもの$wp_filter
は、すべてのフィルタ名をサブ配列として保持するグローバルなArray
です。これらの各サブ配列は、優先順位配列の下で呼び出されたコールバックであるサブ配列をさらに多く保持します。
したがって、 execute 関数が呼び出されると、WordPressはそれらのグローバル配列を検索してその名前のキーを探します。それからアタッチされたコールバックは優先順位の後に実行されます。前もって起こる唯一のことはall
フィルタに付随するコールバックです。
add_action
またはadd_filter
を使用してコールバックを追加すると、WordPressは最初に「固有の」IDを計算して、すでに添付されているコールバックを上書きしません。
$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
それから、コールバックをglobal $wp_filter
スタックに追加します。
$wp_filter[ $tag ][ $priority ][ $idx ] = array(
'function' => $function_to_add,
'accepted_args' => $accepted_args
);
メインのサブ配列が$tag
(またはaction/filter name)であることがわかるように、すべてが特定の優先度の下で召喚され、そして "ユニークな"コールバック/ ID文字列がキーとして使われます。
その後、フィルタが呼び出されたとき - $tag
/action-/filter-nameが発生したとき - 配列が検索され、コールバックが呼び出されます。 call_user_func_array
を使用しているので、実際にはいくつの引数が添付されていてもかまいません。 WordPressはそれを単独で解決します。
foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
call_user_func_array(
$the_['function'],
array_slice(
$args,
0,
(int) $the_['accepted_args']
)
);
}
フック はWordPressコアファイルといくつかの親テーマファイルの両方に含まれています。ファイル内の特定の場所にコンテンツをフックすることができます。
例はWordPressのwp_headフックです。あなたはあなたの子供のテーマでこのフックを使ってその場所にコンテンツを追加することができます。
例:
add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}
いくつかのプレミアムテーマには action hooks が含まれます。これが ビジュアルマップ です。これには、すべてのアクションフックと、それらがGenesisテーマフレームワーク内でコンテンツを出力する位置が含まれています。
例:
add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}
Genesisテーマフレームワークでheader.phpファイルを開いた場合、フックは次のようになります。
do_action( 'genesis_header' );
これが WordPressフックのリストです あなたはいろいろな方法で使うことができます。
フィルタ 既存の関数の出力を修正することを可能にし、WordPressコアファイルとGenesisのようないくつかの親テーマフレームワークの両方に含まれています。
これが フィルタのリストです あなたはGenesis Design Frameworkで使うことができます
これがWordPressに含まれる フィルタのリストです
これは、Genesisのようなテーマフレームワークでフィルタを使用する方法の例です。
add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}
上記のコードは、作成者があなたのコメントにテキストを言うのを変更するために子テーマで使用することができます。どんなテーマでも使えます。
これは、抜粋の長さを50語にカスタマイズする別の例です。
add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50;
}
The_excerpt()関数は wp-includes/post-template.phpファイルにあります。
これは次のようなものです。
function the_excerpt() {
echo apply_filters('the_excerpt', get_the_excerpt());
}
プラグインでフックやフィルタを使用してまったく同じことを実行することもでき、親テーマまたはWordPressを更新してもコードが失われることはありません。
基本的に、フックとフィルタを使用すると、WordPressのコアファイルや親テーマファイルを編集せずに、WordPressと親テーマの両方をカスタマイズおよび変更できます。
親テーマのテンプレートファイルを編集する必要がないため、親テーマのフレームワークにフックとフィルタが含まれている場合、子テーマをカスタマイズする方がはるかに簡単です。これにより、安全にテーマを変更することができます。