WordPressフック:独自のフックを追加するための初心者向けガイド

WordPressフック:独自のフックを追加するための初心者向けガイド

WordPressフック:独自のフックを追加するための初心者向けガイド
СОДЕРЖАНИЕ
02 июня 2020

プラグインは WordPressを拡張する方法。 WordPressで入札を行うのが非常に簡単な理由は、ソースコード全体に散らばっているフックに関係しています。.


投稿が公開されたらすぐに何かしたいですか?抜粋の長さを変更したいですか?独自のページビュー統計を作成したいですか?正しいフックを見つけることはあなたがする必要があるすべてです.

しかし、プラグインで同じことをするのはどうですか?フックは、WordPressで使用するためだけのものではなく、基本的に、自分の作業で実装できる設計パターンです.

この記事では、独自のフックを作成して、自分や他の人が自分の作業を簡単に構築できるようにする方法を紹介します.

フックが必要な理由

フックがいかに優れているかを示すために、実際の例を見てみましょう。 高度なカスタムフィールド. このプラグインを使用すると、柔軟なカスタムデータフィールドを投稿に追加できます。 Googleマップ、数値フィールド、多肢選択などについて話している.

これはすべて、優れたユーザーインターフェイスを介して行われます。必要なのは、フロントエンドでget_field()やthe_field()などの関数を使用することだけです。ここまでは順調ですね.

物を売ることができるツールを構築していて、価格用のフィールドと通貨用のフィールドを提供しているとします。ただし、内部的には、ユーザーがどの通貨で表示するように選択したかに関係なく、常にドルで価格を保存する必要があります。.

ACF(高度なカスタムフィールド)にフックがない場合、これは困難です。このフィールドを保存するために、ACFの外部のメカニズムを使用する必要がある場合があります。幸いなことに、私たちは acf / save_post アクション。このアクションを使用して、保存する前に$ _POSTデータを変更できます–価格をドルに変換する絶好の機会.

これはフックの非常に実用的な例ですが、別の理由もあります。将来の証明と拡張性です。フックは一種のAPIのようなもので、方向性を提供します。いわばフレームワーク。重要なデータを保存する場合は、必要に応じて他のユーザーがデータを操作できるように、フックを自動的に作成する必要があります。アプリケーションに重要なもの、たとえば画像を表示している場合は、表示される画像の数を定義するために使用できるフィルターを使用します.

内部でのフックの仕組み

独自のフックを作成するには、WordPressが内部で行うことを正確に行います。do_action()関数とapply_filters()関数を使用して、フックされたすべての関数を実行します。 WordPressのソースコードを見て、これらがどのように機能するかを見てみましょう.

WordPressはwp_trim_excerpt()関数を内部的に使用して、抜粋を作成します。 WordPress 4.1では、この関数はwp-includes / formatting.phpで2542行目から定義されています。注意を2560行目にすると、次のようになります。

$ excerpt_length = apply_filters( ‘excerpt_length’、55);

これが意味することは次のとおりです。excerpt_lengthフックにフックされているすべての関数を実行し、最終的な値を返します。抜粋の長さを変更する3つのプラグインを使用しているとしましょう。これらの機能を1か所にまとめて見てみましょう。

add_filter( ‘excerpt_length’、 ‘plugin_a_excerpt_modify’、20);
plugin_a_excerpt_modify($ length){
$ length-10を返す;
}

add_filter( ‘excerpt_length’、 ‘plugin_b_excerpt_modify’、32);
plugin_b_excerpt_modify($ length){
戻り104;
}

add_filter( ‘excerpt_length’、 ‘plugin_c_excerpt_modify’、16);
plugin_c_excerpt_modify($ length){
20を返します。
}

最終的に、抜粋の長さは104ワードになります。フィルターは優先順位の高い順に実行されます。したがって、プラグインCの機能が最初に実行されます。他の関数がフックされていない場合、長さは20ワードになります。次に、プラグインAが起動し、長さが10になります。最後に、プラグインBが計量され、長さが104になります。.

do_action()はまったく同じメカニズムを使用して、最初のパラメーターとして定義されたフックに関連付けられたすべての関数を実行します.

このパターンは完全に囲まれており、特別な定義に依存していないことに注意してください。 do_action( ‘lol_hook’)は好きな場所で使用できますが、最悪のシナリオでは、lol_hookに関連付けられている関数はありません。つまり、独自のフックを作成するためのインフラストラクチャがすでにあります!

独自のフックを作成する

上で述べたように、do_action()やadd_filterを使用して、 それを文書化する. このようにして、コーダーとユーザーは実際にそれが存在することを知るでしょう.

次のように、データベースから直接取得した最新のアップロードされた画像のギャラリーを作成するとします。

$ args = array(
‘post_type’ => 「添付」,
‘post_status’ => ‘どれか’,
‘orderby’ => ‘日付’,
‘注文’ => 「DESC」,
‘posts_per_page’ => 10,
‘フィールド’ => 「ID」
);
$ images = new WP_Query($ args);
$ gallery = ‘[‘ .’gallery ids ="’。 implode( ‘、’、$ images)。 」"’。’] ‘;
echo do_shortcode($ gallery);

この例では、日付順で結果が10件に制限されている画像のみを取得することを確認するクエリを作成します。 fieldsパラメータを使用して、IDの配列が返されることを確認しました。次に、この情報から通常のWordPressギャラリーショートコードを作成しました.

ここにフックを追加するには、2つの方法があります。次のように、$ args配列の定義の直前に追加できます。

$ posts_per_page = apply_filters( ‘my_gallery / posts_per_page’、10);

この場合、配列で$ posts_per_page変数を使用する必要があります。おそらく、より良い解決策は、アレイ全体を変更できるようにすることです。これにより、他のプラグイン(または将来的にはあなた)がギャラリーにカテゴリ、タグ、およびその他の制限を追加できるようになります–完全なコードは次のとおりです。

$ args = array(
‘post_type’ => 「添付」,
‘post_status’ => ‘どれか’,
‘orderby’ => ‘日付’,
‘注文’ => 「DESC」,
‘posts_per_page’ => 10,
‘フィールド’ => 「ID」
);

$ args = apply_filters( ‘my_gallery / query_args’、$ args);

$ images = new WP_Query($ args);
$ gallery = ‘[‘ .’gallery ids ="’。 implode( ‘、’、$ images)。 」"’。’] ‘;
echo do_shortcode($ gallery);

これですべてです。他のプラグインはmy_gallery / query_argsフックを使用して、作成されたギャラリーの機能を変更できるようになりました.

命名に関する注記:スラッシュはまったく必要ありません。 「my_plugin_query_args」またはその他の任意の形式を使用できます。スラッシュを作成するプラグインとそれが提供する機能を明確に示しているので、スラッシュが好きです。.

結論

フックは非常に強力で、WordPressの拡張だけでなく、独自のプラグインやテーマの拡張にも使用できます。行き過ぎてアプリケーションの隅々にフックを追加しないように注意する必要があります.

order、post status、post_type、posts_per_pageにフックを個別に追加する代わりに、配列全体を一度に変更できるフィルターを追加しました。他のデータのビットはフックを追加する意味がないかもしれません、これは最終的にあなた次第です.

よりモジュール化された拡張可能なアプリケーションを作成して頑張ってください。独自のフックを以前にクールな場所で使用したことがある場合はお知らせください!

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Это интересно
    Adblock
    detector