フック:フィルターとアクション。 詳細なガイダンス。 WordPress初期化フック:利点とよくある間違い
フックとは何ですか? 簡単に言えばフックは、関数をバインドできるワードプレス関数です。 英語から翻訳すると、フックはフックなので、いわば標準関数に接続されています。 たとえば、投稿を削除する関数では、投稿が削除されたときにのみトリガーされる関数をバインドします。 フックを適切に使用することで、WordPressの基本機能を大幅に拡張できます。
WordPressフックの使い方の簡単な例を紹介します。 ポストパブリッシングフックを基礎として考えてみましょう。 publish_post、投稿を追加するためのポイントをユーザーに追加する関数を作成します。
フックの使い方
フックは、pluginsまたはfunctions.phpのいずれかで使用されます。 フックを呼び出すには、次のように記述する必要があります。
Add_action( "publish_post"、 "add_point");
add_point-作成している関数の名前。
フック機能例
私の場合、関数は次のように機能します。
ユーザーがエントリを追加すると、関数を呼び出すフックがトリガーされ、そこですべての魔法が発生します🙂関数では、クラスを操作します $ wpdb->更新、特定のユーザーのスコアでテーブルを更新します。 レッスンでは、クラスについて話しました $ wpdb->挿入これに基づいて、を使用して関数を作成できます $ wpdb->更新、このクラスも同様に機能します。
これは、フックの構造が大まかにどのように見えるかです。
関数add_point()(//ここに関数)add_action( "publish_post"、 "add_point");
関数内のすべては、投稿が公開されたときにトリガーされます。 WordPressサイトで利用できる他のフックを使用できます。
スコアを更新する関数は次のとおりです。
関数add_point()(global $ wpdb; $ user_ID = get_current_user_id(); $ result = $ wpdb-> get_results( "SELECT points FROM user_points WHERE user =" "。$ User_ID。" ""); $ Update = $ result- >ポイント+10; $ wpdb-> update( "user_points"、array( "points" => $ update、)、array( "user" => $ user_ID)、array( "%d"、)、array( " %d "));)add_action(" publish_post "、" add_point ");
この関数はまだ完成していません。わかりやすくするために、フックと関数をどのように操作できるかを明確にするために示しました。
あなたがフックに不慣れであるならば、この記事はあなたを助けます。 この記事に記載されている例は、WordPressコアと、プラグイン開発者としての長年の経験から得られたものです。
WordPressフックは、プラグインやテーマを壊すリスクなしに機能を拡張できる機能です。
フックとは何ですか?
「do」フックは「アクション」と呼ばれます。 アクションが定義されている場合はいつでも、独自のコードを実行できます。 ここではいくつかの例を示します。
- 送信 Eメール投稿が公開された後、作者に。
- ページフッターにカスタムスクリプトをロードします。
- ログインフォームの上に手順を追加します。
カスタマイズフックはフィルターと呼ばれます。 フィルタを使用すると、値を変更またはカスタマイズして、新しい形式で返すことができます。 ここではいくつかの例を示します。
- 大文字での投稿タイトルの出力。
- メインコンテンツの下に関連する投稿へのリンクを添付する。
- データベースから取得したパラメータを変更します。
フィルタの場合、位置だけでなく戻り値も重要です。 WordPressには、処理するほぼすべての値に対するフィルターがあります。
フック手順要素
アクションの例としてwp_headフックを使用し、フィルターの例としてthe_contentフックを使用してみましょう。
フック(名詞)
フック自体は、魔法がいつどこで発生するかを示しています。 これが、登山者が岩の表面に打ち込んだフックだと想像してみてください。 フックには特定の位置があります。 他の登山者がこの方向に移動したい場合は、それを使用できます。
アクションフックは、do_action関数を使用して呼び出されます。
do_action( "wp_head");
フックはapply_filters()を使用して呼び出されます。
$ content = apply_filters( "the_content"、$ content);
ご覧のとおり、フィルターからのデータをインターセプトする必要があります。
アクションとフィルター
フックプロシージャの次の要素は、アクションまたはフィルタです。 これは、何かを実行またはフィルタリングするために定義する関数です。 これは、グラップリングフックを使用して少し高く登ることをいとわない登山家です。
wp_headで実行されるアクションはnoindex()です。
functionnoindex()(//ブログが公開されていない場合は、ロボットに通り過ぎるように指示します。if( "0" == get_option( "blog_public"))wp_no_robots();)
フックは、検索エンジンの可視性設定が無効になっているかどうかを確認します。 もしそうなら、wp_no_robots()はメタを追加します ロボットタグを示す サーチエンジンサイトにインデックスを付けないでください。
the_contentのフィルターの例は、wpautop()です。 彼はタグの段落を折り返す責任があります
そしてタグを使用する
改行用。
functionwpautop($ pee、$ br = true)(//…return $ pee;)
アクションとは異なり、フィルター関数には少なくとも1つの引数が必要です。 返却する必要があります。
フック(動詞)
WordPressフック手順では、フックの目的を指定する必要があります。 これは、関数(動詞)をフック(名詞)にバインドする必要があることを意味します。 これは、誤ってフックと呼ばれることが多い関数を使用して行われます。
wp_headフックとnoindex()アクションの場合、通信は次のコード行で確立されます。
add_action( "wp_head"、 "noindex"、1);
3番目のパラメーターは優先度です。 以下で説明します。
the_contentでwpautop()を有効にするには、次の行を使用します。
add_filter( "the_content"、 "wpautop");
これらは、フック手順の基本原則です。 これらについては、次のセクションで詳しく説明します。
あなたはすでにこれらのフックを使用しています
テーマを「ただ」変更したり、functions.phpファイルにコードを追加したりしても、すでにアクションとフィルターを使用しています。
WP_HEAD
ファイルにあるTwentyFifteenテーマヘッダーセクションについて考えてみます。 wp-コンテンツ/テーマ/二十五/header.php.
class = "no-js">
タグの開始と終了の間
ホストされているコードはそれほど多くありませんが、ブラウザでページのソースを表示します。 タグを含むさまざまなメタ要素が表示されますheader.phpファイルに存在しない可能性のある要素は、wp_head()関数で追加されます。 開発環境を使用している場合は、その内容を表示してください。
/ ** * wp_headアクションを起動します** @since 1.2.0 * / functionwp_head()(/ ***フロントエンドを介してheadタグにスクリプトまたはデータを出力します。** @Since 1.5.0 * / do_action ( "wp_head");)
wp_head()が行う唯一のことは、wp_headフックを出力することです。 これは、テーマがwp_head()の代わりにdo_action( ‘wp_head’)を使用できることを意味します。
このフックはすでにカーネルによって使用されています。 WordPressがデフォルトでこのフックに接続するアクションの一部を次に示します。
add_action( "wp_head"、 "_ wp_render_title_tag"、1); add_action( "wp_head"、 "wp_enqueue_scripts"、1); add_action( "wp_head"、 "feed_links"、2); add_action( "wp_head"、 "feed_links_extra"、3); add_action( "wp_head"、 "rsd_link"); add_action( "wp_head"、 "wlwmanifest_link"); add_action( "wp_head"、 "adjacent_posts_rel_link_wp_head"、10.0); add_action( "wp_head"、 "locale_stylesheet"); add_action( "wp_head"、 "noindex"、1); add_action( "wp_head"、 "print_emoji_detection_script"、7); add_action( "wp_head"、 "wp_print_styles"、8); add_action( "wp_head"、 "wp_print_head_scripts"、9); add_action( "wp_head"、 "wp_generator"); add_action( "wp_head"、 "rel_canonical"); add_action( "wp_head"、 "wp_shortlink_wp_head"、10,0); add_action( "wp_head"、 "wp_site_icon"、99);
これらには、noindex()アクションと(WordPress 4.1以降)タイトルタグを生成する_wp_render_title_tag()呼び出しが含まれます。
コンテンツ
知らないうちに使用したフィルターフックの例は、the_contentです。
これは、投稿またはページのコンテンツを表示するために使用される_content()関数の背後に隠されています。 これには、the_contentフックへの呼び出しが含まれています。
functionthe_content($ more_link_text = null、$ strip_teaser = false)($ content = get_the_content($ more_link_text、$ strip_teaser); //…$ content = apply_filters( "the_content"、$ content); $ content = str_replace( "]]> "、"]]> "、$ content); echo $ content;)
デフォルトでは、いくつかのフィルターがすでにthe_content関数に接続されています。
add_filter( "the_content"、 "wptexturize"); add_filter( "the_content"、 "convert_smilies"); add_filter( "the_content"、 "convert_chars"); add_filter( "the_content"、 "wpautop"); add_filter( "the_content"、 "shortcode_unautop"); add_filter( "the_content"、 "prepend_attachment");
これらのフィルターは、フォーマットと範囲を担当します。 特殊文字本文中。 また、アイコンなどの要素を添付するためのプラグインでも広く使用されています ソーシャルネットワークまたは関連する記録。
the_contentの使用に関するチュートリアル
フックの誤用が関数の失敗を引き起こす可能性がある方法の2つの例を次に示します。
the_content()関数の本体には、get_the_content()の呼び出しも含まれています。 いくつかのテーマで、最初のテーマの代わりに2番目のテーマが使用されているのを見てきました。 ただし、このようにすると、フック自体が無効になり、多くの機能が機能しなくなります。
the_contentに接続している場合は、コンテンツページだけでなく、リストページでも使用されることに注意してください。 たとえば、アーカイブやホームページにあります。
フック手順パラメータ
必要な主なパラメーターは、フックの名前、関数の名前、優先度、およびフックに渡される引数です。
add_filter呼び出しは次のようになります。
add_filter($タグ、$関数、$優先度、$ Accepted_args);
フック名($ teg)
WordPressコア、プラグイン、またはテーマで使用されているフック名では何もできません。 ただし、独自の名前を設定するときに従うべきいくつかの原則があります。
アクションの名前には、場所、フィルターの場所、および変更する値を含める必要があります。
アクションの例には、場所に応じて名前が付けられたwp_headおよびwp_footerが含まれます。 接頭辞または接尾辞もよく使用されます。 例:before、pre、begin、after、end。
投稿の削除を担当するwp_delete_post()関数には、次のフックが含まれています。
- before_delete_post;
- delete_post;
- delete_post;
- after_delete_post。
フック名のプレフィックス
位置と値に加えて、プレフィックスフックプレフィックスを指定する必要があります。 例えば:
- wpseo_ by Yoast SEO
- Genesis_ from Genesis Framework;
- AdvancedAdsプラグインのadvanced_ads_。
これにより、他のプラグインまたはスキンのフックとの競合が防止されます。
動的フック名
プラグインには多くのパラメーターがあり、他の開発者がそれぞれにフィルターを使用できるようにしたいとします。 これを行うには、パラメーターごとにapply_filters()を呼び出す必要があります。 また、WordPressがget_options()関数で行うように動的フック名を使用することもできます。
この機能には、次のフックが含まれています。
- 「pre_option_」。 $オプション;
- 「default_option_」。 $オプション;
- 'オプション_'。 $オプション。
これを知っていると、option_blognameまたはoption_blogdescriptionにフックして、ブログのタイトルまたは説明を動的に変更できるはずです。
魔法の「すべて」
add_action()およびadd_filter()を呼び出すときは、フック名として特別なタグを使用できます。 これにより、リンクされた関数が各フックで使用されるようになります。
関数名
単純な関数を呼び出すときは、プレフィックスを追加します。 これにより、それを識別する他のヘルパー関数との競合が防止されます。
フォーラムでmy_で始まる関数名を見つけることができます。 このプレフィックスを独自のものに変更します。
add_filter( "the_content"、 "bestpluginever_capitalize_all_words");
クラス内の静的関数を接続することも可能です。
add_filter( "the_content"、array( "bestpluginever"、 "capitalize_all_words"));
このクラスのインスタンスで呼び出すと、次のようになります。
add_filter( "the_content"、array($ bestpluginever、 "capitalize_all_words"));
同じクラスのインスタンスでメソッドを呼び出すこともできます。次に例を示します。
add_filter( "the_content"、array($ this、 "capitalize_all_words"));
また、関数がパブリックであることを確認してください。
デフォルトのPHP関数を使用する
V 特定の場合独自の関数を作成する必要はありません。 このフック手順は、投稿タイトルの最初の文字をすべて大文字にします。
functionbestpluginever_capitalize_title($ title)(returnucwords($ title);)add_filter( "the_title"、 "bestpluginever_capitalize_title");
ucwords()は、値を受け取って返す標準のPHP関数であるため、次の1行に省略できます。
add_filter( "the_title"、 "ucwords");
優先事項
add_action()およびadd_filter()の3番目のパラメーターは優先順位です。 フック関連の関数が呼び出される順序を設定します。
このパラメーターはオプションであり、明示的に定義されていない場合、デフォルトは10です。 同じ優先度の複数の関数は、フックに登録された順序で呼び出されます。
Advanced Adsプラグインは、コンテンツの前後に広告を挿入するときにthe_contentを使用します。 3番目のパラメーターは、広告またはその他のコンテンツを最初に挿入するかどうかを決定します。 アイテムの「間違った」順序に対するサポートコールを回避するために、オプションとしてフィルターの優先度を選択するオプションをユーザーに提供しました。
アクションの進行状況を確認する
Did_action()を使用して、特定のアクションが実行されたかどうかを確認できます。
_wp_render_title_tag関数がwp_headに接続されました。 これは、Wordpressエンジンがタイトルタグが実際にここでのみ作成されていることを確認する方法の例です。
function_wp_render_title_tag()(if(!current_theme_supports( "title-tag"))(return;)//これはwp_head内でのみ機能します。if(!did_action( "wp_head")&&!doing_action( "wp_head"))(return; ) エコー "
did_action($フック)は、現在の呼び出しを含め、アクションが実行された回数に関する情報を返します。 _wp_render_title_tag()がwp_headで実行されると、関数は1を返します。 do_action( ‘wp_head’)は、現在wp_headアクションを実行しているかどうかを確認します。 実際、上記のコードはダブルチェックです。 このため、WordPress4.4.0から削除されます。
do_action()関数は、アクションが実際に行われているかどうかを確認します。
フィルタの使用状況を確認する
did_action()およびdo_action()フィルターのエイリアスはありません。 代わりにhas_filter($フック、$関数)を使用してください。 $フックのみを指定した場合、フックに関数が登録されていればtrueを返します。 それ以外の場合はFalse。
関数$関数も渡された場合、その関数の優先度が返されます。この関数が接続されていない場合はfalseが返されます。
特定の段落の後に広告を追加する場合、Advanced Adsプラグインは、カスタムフィルター関数が適用される前にwpautop()が呼び出されることを確認する必要があります。
$ wpautop_priority = has_filter( "the_content"、 "wpautop"); if($ wpautop_priority && $ advads_content_injection_priority()<$wpautop_priority){ $content=wpautop($content); }
このコードスニペットを使用して、wpautop()の優先度が広告の有効化機能の優先度よりも高いかどうかを確認しています。 段落がまだ設定されていないことが判明し、これはプラグインに最初に段落を作成するように指示します。
引数
用語がデータベースから削除された後に実行されるdelete_termフックについて考えてみます。
do_action( "delete_term"、$ term、$ tt_id、$ taxonomy、$ delete_term);
add_action()またはadd_filter()関数を使用する場合、4番目のパラメーターは、アクションまたはフィルター関数が予期する引数の数です。
この場合、フック関数はこれらの4つの引数を使用できます。 ただし、これはオプションです。 これは、カーネルに実装されている関係によって確認されます。
add_action( "delete_term"、 "_ wp_delete_tax_menu_item"、10.3);
アクションは最初の3つの引数のみを使用し、$ deleted_termは使用しません。
function_wp_delete_tax_menu_item($ object_id = 0、$ tt_id、$ taxonomy)(// ...)
引数の数の難しさ
指定する引数の数は、関数が使用する数と一致する必要があります。 ただし、引数がない場合、または引数が1つしかない場合、このルールはオプションです。
関数にさらに引数が必要な場合は、それらを設定する必要があります。そうしないと、エラーメッセージが表示されます。 それらをインストールした場合は、優先度も設定する必要があります。これは多くの場合オプションです。
アクションとフィルターの削除
フックからアクションまたはフィルターを削除することは珍しいことではありません。 人気のある例は、WordPress4.2から絵文字を削除することでした。
Disable Emojisプラグイン全体は、以下のコードに要約できます。
functiondisable_emojis()(remove_action( "wp_head"、 "print_emoji_detection_script"、7); remove_action( "admin_print_scripts"、 "print_emoji_detection_script"); remove_action( "wp_print_styles"、 "print_eles"); remove_filter( "the_content_feed"、 "wp_ remove_filter( "comment_text_rss"、 "wp_staticize_emoji"); remove_filter( "wp_mail"、 "wp_staticize_emoji_for_email");)、add_action
wpautop()関数を無効にするプラグインもあります。 これは、functions.phpファイルの1行のコードで実行できます。
remove_filter( "the_content"、 "wpautop");
remove_action()関数とremove_filter()関数は、次の3つの引数を取ります。
- 関数;
- 優先順位。
それらはすべて、add_action()およびadd_filter()の値と一致する必要があります。 難しいのは、フックがすでに追加されている場合にのみフックが削除されるという事実です。
フックを見つけるにはどうすればよいですか?
フックを見つけるには、変更または追加したいものを知っている必要があります。 開始するには、現在のコードですでに使用されている関数を簡単に調べることができます。
使用できるもう1つのリソースは、プラグインAPIページです。 重要な機能やその他の役立つ情報が一覧表示されます。
デバッグフック
フックをデバッグするには、接続されているすべてのアクションとフィルターのリストを作成します。
error_log()の使用
フィルタのデバッグには、エラーログ()をDEBUG_LOGと組み合わせて使用することをお勧めします。 これにより、出力がdebug.logファイルに書き込まれますが、フロントエンドからは表示されません。
functionexample_content_filter($ content)($ option = get_option( "add_haha"); error_log($ option); if($ option === true)($ content。= "HAHA
"。$ content;)return $ content;)add_filter(" the_content "、" example_content_filter ");
上記のスクリプトでは、コンテンツにHAHA行を追加しています。 ただし、パラメータがtrueを返す場合のみ。 それが機能しない場合は、error_log($オプション)を使用できます。
HOOKAPIの使用
フックをデバッグする別の方法は、上記の関数を使用することです。 たとえば、doing_action()またはdid_action()。
このリストにcurrent_filter()を追加することもできます。 これを使用して、現在のフックの名前を表示できます。
functionmy_filter()(echocurrent_filter(); // "the_content")add_filter( "the_content"、 "my_filter");
これがカーネルのどこで使用されているかを知りたい場合は、capital_P_dangit()を見てください。
選択したテーマテンプレートファイルが接続される前に発生します。例:single.php、page.php、search.php、404.phpなど。 このフィルターは、そのようなファイルへのパスを変更するために使用されます。
filter_redirectイベントの後、およびWordPressがテンプレートファイルとして使用するファイルを取得した後に、フィルターが起動します。 ページの種類ごとに、ファイルは異なります。テーマファイルの階層を参照してください。 たとえば、永続的なページに移動しました。WordPressは、表示するテンプレートファイルを選択します。これはpage.phpファイルです:home / site.ru / wp-content / themes / mytheme /page.php。 このフィルターを使用して、そのようなファイルのパスを変更できます。
このフィルターの間、条件付きタグはすでに使用でき、$ post変数はすでに定義されています。
使用法
add_filter( "template_include"、 "filter_function_name_11"); function filter_function_name_11($ template)(// Filter ... return $ template;)$ template (ライン)テンプレートとして含まれるファイルへのフルパス。 例:home / wptest.ru / wp-コンテンツ/テーマ/パブリッシャー/page.php。の例
#1テーマディレクトリ内のファイル
永続ページのテンプレートは、テーマディレクトリにファイルを作成し、ファイルの先頭にPHPコメントを指定することで設定できます。
次に、ページを作成するときに、ドロップダウンリストで作成したテンプレートを選択する必要があります
#2。 正確に名前が付けられたテーマファイル
または、テーマで、page-portfolio.phpファイルを作成します。 この場合、ページラベルは「ポートフォリオ」と同じである必要があります。
#3。 Template_includeフィルター
また、ポートフォリオショートカットページ用に個別のテンプレートファイルを作成する3番目の方法は、template_includeフィルターを使用することです。
Add_filter( "template_include"、 "portfolio_page_template"、99); function Portfolio_page_template($ template)(if(is_page( "portfolio"))(if($ new_template = Locate_template(array( "portfolio-page-template.php")))$ template = $ new_template;)return $ template;)
この方法は、プラグインやアドオンをテンプレートに作成するときに役立ちます。 特定のスラッグを使用してページを作成する必要がある場合は、それだけです。
#4PHP関数をテンプレートファイルとして含める
テンプレートコードを使用してファイルを作成するのではなく、このファイルのコードを使用してPHP関数を作成すると便利な場合があります。 そして、そのような関数をファイルとして機能させるために、template_includeフックで呼び出すことができます。
見出し
いくつかのテキスト
知っておく必要があります!
これは技術的に間違った解決策ですが、機能します! この場合、フィルターはイベントとして使用されます。 そして、このフィルターはテンプレートに関係のないフィルターの中で最後と呼ばれるので、それを呼び出す瞬間に、必要なテンプレートコードを表示できます...
#5現在使用されているテンプレートファイルを確認する方法
これを行うには、template_includeフィルターに渡されるものを確認します。
##現在使用されているテンプレートadd_filter( "template_include"、 "echo_cur_tplfile"、99); 関数echo_cur_tplfile($テンプレート)(echo " "。wp_basename($テンプレート)。""; $テンプレートを返す;)
WordPressで物事を成し遂げるための基礎の1つは、フックがどのように機能するかを理解することです。 それ自体は難しいことではありませんが、この記事では基本を説明します。
しかし、より深い知識を得たい場合でも、フックの使用方法を知る必要があります。
WordPressフックシステムとその使用方法、およびアクションフックとフィルターフックについて説明します。
始める前に、始めるために必要なものがすべて揃っていることと、最新バージョンのWordPressがインストールされていることを確認してください。
フックとは何ですか?
WordPressフックを見る前に、イベント駆動型開発アーキテクチャを理解する必要があります。
既存のWordPressフック、フロントエンドWeb開発、またはJavaScriptを使用したことがある場合は、正式な名前が付けられていることを知らなくても、おそらくこの概念に精通しているはずです。
イベントドリブンアーキテクチャ(英語のイベント駆動型アーキテクチャ、EDA)は、イベントの作成、定義、消費、および反応を可能にするソフトウェアアーキテクチャパターンです。
プロジェクトテンプレートまたは開発を始めたばかりの場合、これは気が遠くなるように思えるかもしれませんが、次のように考えることをお勧めします。
- ソフトウェアは、特定の時間にイベントに関するメッセージを送信する場合があります。
- 開発者として、これらのメッセージを監視し、カスタムコードで応答するコードを書くことができます。
定義はイベントの作成も扱っていることに注意してください。 独自のフックについて説明するときは、このトピックに戻ります。 それでは、Web開発における2つの一般的なイベントを見てみましょう。
JavaScriptの使用
フロントエンド開発で作業していると想像してください。 ID属性のコマンドボタンが付いたボタンがあり、ユーザーがそれをクリックすると、ダイアログボックスが開きます。
jQueryを使用すると、次のようにこの機能を実装できます。
(function($)( "use strict"; // jQuery "s DOM-ready event-handler $(function()(/ ***識別されたボタンの" click "イベントを*"コマンドボタンでリッスンします"ID属性。**ユーザーがクリックすると、アラートダイアログが表示されます。* / $("#コマンドボタン ")。バインド("クリック "、関数(evt)(アラート("ボタンをクリックしました。 " );));));))(jQuery);
コード内のコメントは、それがどのように機能するかを説明しています。 つまり、ユーザーがボタンをクリックすると、ブラウザはイベントを再生します。 これが発生すると、コードはイベントをリッスンし、ダイアログボックスを表示して応答します。
もちろん、他のライブラリ、フレームワーク、またはバニラJavaScriptも同じ機能セットを提供します。 jQueryについて話している理由は、jQueryが最も広く使用されているJavaScriptライブラリの1つであり、WordPressに関連しているためです。
WordPressの使用
このパターンの適用は、プログラミング言語またはパラダイムによって異なります。 多くの場合、プラットフォームまたはアプリケーションが提供するAPIに依存します。
WordPressでは、イベントを発生させる独自のコードを登録することは少し異なります。 たとえば、WordPressの管理ページで作業していて、[設定]メニューに新しいサブメニュー項目を追加したいとします。 それをTuts + Optionsと呼びましょう。
これを行うには、functions.phpファイル、プラグイン、または使用しているプロジェクトの種類に次のコードを追加します。
フックの詳細については、Codexにアクセスしてください。 admin_menuと機能 add_submenu_page.
このコードはメニューに新しい機能を追加しませんが、ブラウザがクリックイベントを提供するのと同じ方法でWordPressがadmin_menuイベントを提供することを示しています。 次に、関数を定義し、イベントが発生したときにそれを実行することで、独自のコードを挿入できます。
これらは、イベント駆動型デザインパターンを実装および使用する方法の2つの例です。
WordPressのアクションを理解する
イベント駆動型の開発パターンと2種類のパターンの実装について説明しましたが、WordPressのアクションフックを見てみましょう。 利用可能なフックとそのアプリケーションについて説明します。
ファイルの設定
このチュートリアルのコードでは、テーマを使用します 二十六 WordPressによって提供されます。
テーマディレクトリのルートにtutsplus-actions.phpというファイルを作成します。 次に、次のコード行をfunctions.phpに追加します。
これは、定義したファイルをロードするようにテーマに指示します。 これは、テーマのコアにコードを挿入せず、include_onceを削除することでコードを簡単に削除するためです。
アクションの簡単な定義
WordPressのフックには、アクションとフィルターフックの2種類があります。 アクションフックを使用すると、特定の機能を追加、削除、または変更できます。 また、フィルターフックは、情報の追加、削除、および変更を担当します。
つまり、アクションフックは機能を処理し、フィルターは情報を処理します。
アクションフックとフィルターフックの詳細を調べた後、フックの一般名で他のフックを見つけることができます。
これは技術的には正しいですが、作業しているフックのタイプを特定するのが最善です。
アクションフックはいくつかのことを行い、フィルターは完全に異なるためです。
アクションの操作
上記のコードでアクションフックの例についてはすでに説明しましたが、より完全で実用的な例を見てみましょう。
WordPressには、投稿(通常のブログ投稿用)とページ(永続的なコンテンツ、または頻繁に変更されないコンテンツ用)の2種類の投稿があります。 通常のブログプラットフォームの場合は、それで十分です。 しかし、WordPressは長い間CMSになりました。
そして、WordPressを拡張可能にする機能の1つは、カスタム投稿タイプを提示する機能です。 WordPressはそれらをカスタム投稿タイプと呼び、独自の属性タイプを必要とし、「投稿」または「ページ」という名前に適合しないコンテンツタイプを作成する必要がある場合に便利です。
独自のカスタム投稿タイプを作成するには、次の2つのことを行う必要があります。
- WordPressで指摘されているように、initフックにしがみつく関数を定義します
- 利用可能なAPI関数の1つを使用して投稿タイプを登録します
登録アクション
アクションフックを登録するには、WordPressAPIが提供するadd_action関数を使用します。 これにより、アクションフックが導入され、関数呼び出しで指定した名前で指定された関数を実行する必要があることがWordPressに通知されます。
コードは次のようになります。
このコードでは、WordPressに存在する初期化フックを使用して関数を登録しています。 このフックはWordPressループを開始し、カスタム投稿タイプを登録する良い機会です。次に、関数を定義する必要があります。
関数の名前を理解するための鍵は単純です。これは、add_action呼び出しに移動した2番目の引数であるため、tutsplus_register_post_typeと呼びました。
文字通り、WordPressに次のことを行うように指示します。初期化時に、tutsplus_register_post_type関数を呼び出します。
ここまでは順調ですね。 複雑なことは何もしていません。WordPressの管理ページを更新すると、動作に何も変更がないことがわかります。
これを修正しましょう。
カスタム投稿タイプの作成
これで、独自のアクションフックを追加するための基本的なコードができました。 次に、タイトル、エディター、引用のみを含むtime_travelerというカスタム投稿タイプを作成しましょう。
これを行うには、コーデックスのregister_post_type関数を考慮する必要があります。 ドキュメントには、関数が処理できるすべての引数のリストが記載されていますが、カスタム投稿タイプでは、そのうちのいくつかのみを使用しています。
以下を選択しました。
- ラベル
- ラベル
- 説明
- 公衆
- show_ui
- サポート
WordPressが残りの機能を自動的に提供することを願っています。 引数は次のようになります。
"Time Travellers"、 "labels" => array( "name" => "Time Travellers"、 "singular_name" => "Time Traveler"、 "add_new_item" => "Add New Traveler"、 "edit_item" => "Edit Traveller "、" new_item "=>" New Traveler "、" view_item "=>" View Traveler "、" search_items "=>" Search Travellers "、" not_found "=>" No Travellers "、)、" description "=> "タイムトラベラーに関する情報を提供するために使用される投稿タイプ。"、 "Public" => true、 "show_ui" => true、 "supports" => array( "title"、 "editor"、 "excerpt"、)、) ;
最後に、投稿タイプを登録するためのコードの完全版は次のとおりです。
"Time Travellers"、 "labels" => array( "name" => "Time Travellers"、 "singular_name" => "Time Traveler"、 "add_new_item" => "Add New Traveler"、 "edit_item" => "Edit Traveller "、" new_item "=>" New Traveler "、" view_item "=>" View Traveler "、" search_items "=>" Search Travellers "、" not_found "=>" No Travellers "、)、" description "=> "タイムトラベラーに関する情報を提供するために使用される投稿タイプ。"、 "Public" => true、 "show_ui" => true、 "supports" =>
コンソールを更新した後、タイムトラベラーと呼ばれるコメントのすぐ下に新しいアイテムがあるはずです。
[新規追加]をクリックすると、タイトル(または旅行者の名前)、エディター(旅行者情報用)、および引用(おそらく旅行者メモ用)の場所が表示されます。 情報を投稿するためのメタボックスも表示されます。
もちろん、上記のコードは、カスタム投稿タイプを定義するために既存のアクションフックを利用する方法を示しています。 しかし、独自のアクションフックを作成したい場合はどうでしょうか。
カスタムアクションの定義
独自のアクションフックを作成するときは、次の3つの基本的な操作を行う必要があります。
- フックを定義する
- フックに機能を与える
- 開発者がフックを呼び出すことができるようにする
最も簡単な例:
このコードをtutsplus-actions.phpに自由に追加してください。記事を読んだ後、さらに詳しく調べることができます。
その後、コード内の任意の場所でtutsplus_action関数を呼び出すことができます。 たとえば、管理ページの上部に表示したいとします。 これを行うには、次のコードを追加します。
コンソールを更新すると、コンソールの上部に「これはカスタムアクションフックです」と表示されます。
ユーザーにエラーメッセージまたは成功したアクションを送信する予定がない限り、admin_noticesにフックを追加することはお勧めしません。 これは、カスタムフックの例として示しています。
私たちの投稿タイプについての質問へ
単数形と複数形の投稿タイプ名をアクションフックを使用して関数に変換できるカスタム投稿タイプ関数を作成するとします。
これをどのように行うのですか? まず、アクションフックを呼び出すカスタム関数を作成する必要があります。 それをしましょう:
次に、少し直感に反しているように見えるかもしれないことをする必要があります。 カスタム関数をinitフックのコンテキストで実行する必要があるため、initアクション中にフックが実行されることを確認する必要があります。
これを行うには、カスタムフックを初期化フックにアタッチします。
上記のコードでは、do_actionに2つの追加パラメーターを指定していることに注意してください。 最初のパラメータは10で、フック起動の優先度を示します。
パラメータには任意の数を指定できます。パラメータが大きいほど、優先順位リストでの起動は低くなります。 2番目のパラメーターは、カスタムフックが受け入れる引数の数です。 この場合、レコードタイプの単数バージョン用と複数バージョンのレコードタイプ用に1つずつあります。
その後、フックに機能を追加する必要があります。 投稿タイプを登録するためのコードをリバースエンジニアリングして、WordPressからregister_post_type関数に渡される配列で使用される2つの引数を受け入れます。
$ multiple、 "labels" => array( "name" => $ multiple、 "singular_name" => $ singular、 "add_new_item" => "Add New Traveler"、 "edit_item" => "Edit Traveler"、 "new_item" => "New Traveler"、 "view_item" => "View Traveler"、 "search_items" => "Search Travellers"、 "not_found" => "No Travellers"、)、 "description" => "以前の投稿タイプタイムトラベラーに関する情報を提供します。 "、" public "=> true、" show_ui "=> true、" support "=> array(" title "、" editor "、" excerpt "、)、); register_post_type( "time_traveler"、$ args); )
この機能を特定のフックに追加していないことに注意してください。 代わりに、カスタムアクションに接続されている関数定義から呼び出します。
上記のコードでは、独自の引数を渡してカスタム関数をコードに追加することで、カスタム投稿タイプの登録を担当する関数を呼び出すことができます。
結果
フックが何であるかを理解するのは難しいことではありません。 開発者にパワーと柔軟性を追加します。 おそらく、コードで最も気が遠くなるのは、別のフックのコンテキストでフックを定義することです(定義する tutsplus_register_custom_post_type init)。
カスタムフックを登録して、既存のフックを実行する前に実行する必要がある場合があるため、これを最後の例として使用することにしました。
フックの登録は簡単です。admin_noticesコードのように、フックを既存のフックと連結せずに、基本関数を呼び出す必要があります。
タイトルにこれらの名前を正確に書いていなかったのかもしれませんが、その理由を説明します。
フック-フックを意味します。
WordPressエンジンコード自体、プラグイン、またはテーマのどこかに、メインのWordPressファイルやプラグインファイルに影響を与えることなくコードをハングアップできるフックがあります。 したがって、プラグインとエンジンを安全に更新でき、これらのフックで中断されたコードは別の場所に配置されます。
フックは、フィルターとアクションの2つのタイプに分けられます。
- フィルタ関数が変数を返す前に、変数の値を変更できます。
- 行動フックがぶら下がっている場所で、必要なコードを実行できます。
WordPressフックを使い始める前に知っておくべき重要なことは何ですか?
配列、関数、クラスについて少し知っていて、グローバル変数がどのように機能するかをよく理解していれば、フックメカニズムを理解するのははるかに簡単です。また、匿名関数がフックにぶら下がっているコードもたくさんありますが、いくつかの理由で使用することはお勧めしません(PHP 5.3.0が必要ですが、PHPアクセラレーターでは正しく機能せず、キャンセルできません)関数によるそのようなフックまたは)、しかしそれが存在し、それがどのように見えるかはそれだけの価値があることを知っているだけです。
フィルタの段階的な分析
フィルタの主なタスクは、エンジンやプラグインのメインファイルに影響を与えることなく、任意の関数を使用して変数の値を追加で変更することです。これは、原則として、2つの関数-とを使用して行われます。
- それはすべて、WordPressエンジンまたはプラグインのコードのどこかに、後でフィルターによって処理される必要がある変数があるという事実から始まります。 関数はこの変数にハングアップし、関数のアクションの結果は通常同じ変数に割り当てられます。 さらに、フィルターの名前がすぐに指定されます。 たとえば、次のようになります。
$ x = apply_filters( "misha_filter"、$ x); - その後、の助けを借りて、外部からこの変数に影響を与えることができます。 このために、たとえば、functions.phpファイルで任意の名前の関数を作成します。関数の引数は$ x変数であり、関数内で必要なすべてのアクションを実行し、最後に結果変数を返します。 次に、関数の横でを呼び出します。ここでは、フィルターの名前と任意の関数の名前をパラメーターとして指定します。 より少ない言葉、より多くの行動-これはそれがどのように見えるかです:
- やめる! 投稿をさらに読む前に、すべて自分で試してください。 このためのプラグインを作成する必要はありません。テーマ内、たとえばheader.phpに、$ x変数を出力し、表示する前にフィルターを適用して、functions.phpファイルにこのフィルターを適用します。
WordPressエンジン自体の中に投稿コンテンツがある最も単純な例
おそらくあなたはすでにどこかでこの例に出会っています-それは公式のWordPressドキュメントにあります、そして私はすでにそれについて言及しました。
管理パネルのエディターにある投稿の内容と、サイトに表示されている投稿の内容は同じですか、それとも異なりますか?
これはおそらく最もフィルタリングされるものの1つであり、the_contentフィルターを使用すると、関数が投稿コンテンツにスーパーインポーズされ、ショートコードが適用されます。 さらに、ユーザーはいくつかのフックをグーグルで検索し、たとえば、投稿の下にソーシャルメディアボタンを表示することもできます。
はっきりと確認するには、このコードをテーマの便利な場所、footer.php、またはその他の場所に貼り付けてみてください。
アクションフックがどのように機能するかの段階的な分析
アクションフックのタスクは、コード自体を変更せずに、コード内の特定の場所でヘルパー関数を外部から実行できるようにすることです。これはすべて、フィルターの場合と同じ方法で行われ、2つの機能があります-と
- それはすべて、コードのどこかに、追加のコードを実行する必要がある可能性がある場所があるという事実から始まります。 この場所を関数で指定し、そのパラメータとして「フック」の名前を示します。 非常にシンプルに見えます。
単純なメカニズムではありませんか?
WordPressのwp_headフックを使用した最も簡単な例
今、最初に頭に浮かんだのはwp_headだけです。 したがって、まず、サイトでページを開き、ブラウザでHTMLコードとして開きます。 次に、header.phpファイルに移動し、キーを押して関数をそこからすばやく削除します(フックを起動します)。 その後、ページがどの程度変化するかを確認します。スタイル、スクリプト、場合によっては任意のコードが消えます。パラメータと優先順位
優先事項
優先順位について話す方がはるかに簡単なので、まずは優先順位から始めます。 すでに理解しているように、同じフック(「フック」)にかなりの数の関数を掛けることができます。 ただし、これらの関数が同じ変数の値を変更する場合があります。つまり、これらの関数を交換すると、変数の値が異なります。無名関数(PHPバージョン5.3.0以降が必要)とアクションフックを使用した簡単な例を紹介します。 このコードをサイトのどこかに貼り付けると、フックにアタッチされた関数は、コードで接続された順序で実行されます。
add_action( "misha_priority"、function()(echo "A";)); add_action( "misha_priority"、function()(echo "B";)); add_action( "misha_priority"、function()(echo "B";)); //フック自体do_action( "misha_priority"); // ABCが出力されます |
そして今注目-関数と3番目のパラメーターは優先順位の表示をサポートします。これを念頭に置いて、コードを変更します。
ご覧のとおり、優先度の値が高いほど、関数は後でフックに接続されて実行されます。
関数に追加の引数を渡す
完全な幸福のためにまだ欠けているのは、フックで中断された関数への追加のパラメーターの転送です。 そして、この機会も提供されます。それはすべて、1つ以上のパラメーターが関数またはで指定されているという事実から始まります。
do_action( "misha_action"、$ param1、$ param2、$ param3); |
その後、関数の4番目のパラメーター