web-dev-qa-db-ja.com

アクション、機能、および条件

テーマやプラグインを開発するときには、条件付きステートメントを使ってフックに機能を追加する必要がある場合があります。

例:

function my_custom_function() {
    if( is_home()) {
       <---what should the function do--->
    }
}

 add_action( 'some_hook', 'my_custom_function' );

私の理解するところでは、他の条件が存在するときはいつでも(is_homeはfalseを返す)、関数の内容は実行されませんが、関数は「空」であるにもかかわらず実行されます。これは空の関数がフックに渡されることを意味します。これは、コンディショナルタグを使用してすべての例がコーデックスに表示される方法です。

私はこれが安全であることを理解しています、そしてそれはロード時間に少しの影響も与えるべきではありません(ロード時間に少しでも影響があるなら)。

私は考えていた、例として、同じコードの一部は、次のように書くことができます

if( is_home()) {
   function my_custom_function() {
     <---what the function should do--->
   }

  add_action( 'some_hook', 'my_custom_funtion' );

}

is_homeがfalseを返す場合、これはすべてを完全にスキップします。

これら2つの方法のどちらを使用しても構いません。しかし、私が知りたいことは、最初の例が広く使われているので、これが正しい使用方法である、あるいはワードプレス開発者によるとむしろ好ましい方法である、あるいは単に個人的な好みであると述べるコーディング標準です。

7
Pieter Goosen

WordPressのコーディング標準PHP については何も述べられていませんし、他に標準もないので、どちらを選択するかは開発者次第です。

私は2つの方法は異なるアプローチを持っていると言わざるを得ない。最初のものには条件付きロジックが含まれていますが、2番目のものは条件付き関数の宣言です。つまり、関数を呼び出そうとすると、致命的なエラーが発生します。

関数が実行される最初の方法を使用したとしても(アプリケーション負荷では関係のないlostと非常に最小限の影響で)、それを使用するのがより良い方法です。 2番目の方法を使用すると、アプリケーションのビジネスロジックは関数からファイル解析に移動します。

さらに、言及していない3つ目の方法があることを考慮する必要があります。

function my_custom_function() {
    // what the function should do
}

if ( is_home() ) {
    add_action( 'some_hook', 'my_custom_function' );
}

OOPプログラミングを使用すると、このアプローチの利点はよりわかりやすくなります。その場合は、クラスの条件付き宣言は意味がありません(メソッドの条件付き宣言はまったく不可能です)特定の条件下でのみタスクを実行します(フックの起動)。

8
gmazzap

その場で関数を作成しないでください。これを読んでデバッグするのは難しいです。 懸念の分離 を実装し、コールバックの登録実行(ビジネスロジック)から分離します。コールバック登録の前に条件付きチェックを論理的に設定することは今やとても簡単です。
Waitアクションtemplate_redirectがその登録ハンドラをインスタンス化するのは、それがis_home()をチェックできる場合はknowだからです。

class Theme_Hooks
{ 
    public function setup()
    {
        if ( ! is_404() ) {
            add_action(
                get_stylesheet() . '_breadcrumb',
                [ new Breadcrumb, 'render' ]
            );
        }

        if ( is_home() ) {
            add_action(
                get_stylesheet() . '_home_widget',
                [ new Home_Widget, 'render' ]
            );
        }
    }
}

add_action( 'template_redirect', [ new Theme_Hooks, 'setup' ] );
7
fuxia

一般に追加したいのは、次のような条件タグの使用には注意が必要なことです。

if( is_*() )
{
    // stuff
}

functions.phpのグローバルスコープで、これはフィルターまたはアクションがdo_action()またはapply_filters()で起動される前に実行されるためです。

4
birgire

別のオプションを追加したいだけです。 Hybrid Coreフレームワークはコンテキストを認識する "smarter hooks"と呼ばれるメソッドを実装しました。

完全な情報源はここで見ることができます:

https://github.com/justintadlock/hybrid-core/blob/master/functions/core.php

理想的には、これは次のように使用できます。

基本的なフックの例は 'hybrid_header'でしょう。 do_atomic()関数はこれを拡張して、 'hybrid_singular_header'、 'hybrid_singular-post_header'、および 'hybrid_singular-post-ID_header'などの追加のフックを提供します。

0
Anh Tran

私は個人的な好みを言うと思います。

さらに、if文の外側で関数呼び出しを取り、その中でアクションを取る方がきれいです。そのようにしても、ifステートメントがtrueを返す場合にのみ、関数はアクションによって呼び出されます。

関数定義を常にif文の外に置くことで、トラップされて呼び出し不可能になった関数を呼び出すことがなくなります。

0
Berend