web-dev-qa-db-ja.com

名前空間のadd_actionが機能していません

私は自分のプラグインに名前を付けることにしました、そして私は私のメインプラグインファイルを除いて、それがすべてうまくいくようにしました。

プラグインのinitメソッドを呼び出す前に、そのプラグインに2つのアクションを追加しました。

<?php
namespace myPlugin;

add_action( 'admin_init', 'add_activation_notice' );

function add_activation_notice() {
    add_action( 'admin_notices', 'activation_notice' );
}

function activation_notice() {
    echo 'Notice!';
}

しかしこれはエラーを投げます

不明なエラー :未定義の定数 'myPlugin\myPlugin\add_activation_notice'

私は名前空間についてはかなり新しいので、なぜこれが起こるのかわかりません。

add_activation_noticeactivation_noticeの2つの関数は、myPlugin名前空間にあります。私がクラス内でオンライン参照メソッドを見つけたコードのほとんどは、私はプラグインのアクティベーション通知を持つことができるように、これらはクラス外にある必要があります。

編集:

とやってみると

add_action( 'admin_init', \add_activation_notice() );

私は

致命的なエラー :不明なエラー:未定義の関数add_activation_notice()を呼び出しています

2
dingo_d

この道を進みすぎる前に、 PHP名前解決規則 に慣れておくことをお勧めします。

実際の質問に答えるには -

関数に名前を付けるときは、それらの関数の完全修飾名に名前空間が含まれます。

あなたの例では、\myPlugin\add_activation_notice\myPlugin\activation_noticeの2つの関数を定義しました。

myPlugin名前空間内からこれらのいずれかを呼び出すときは、修飾されていない名前(つまりactivation_notice())を使用できますが、myPlugin名前空間の外側では上記の名前解決規則に従う必要があります。

add_action()の場合 - これはmyPlugin名前空間内から呼び出されますが、実際の関数ではなく関数名を文字列として渡します。 WordPressは後でグローバルネームスペースからその関数を呼び出そうとします。

あなたの問題を解決するにはadd_actionに渡される関数名にmyPlugin名前空間を含めることです(エスケープされたバックスラッシュに特に注意を払う):

add_action( 'admin_init', 'myPlugin\\add_activation_notice' );
add_action( 'admin_notice', 'myPlugin\\activation_notice' );

これを行う私の好ましい方法は、 __NAMESPACE__マジック定数 を連結することです。名前空間を変更することに決めた場合は、事態が少し単純化されます。

add_action( 'admin_init', __NAMESPACE__ . '\\add_activation_notice' );
add_action( 'admin_notice', __NAMESPACE__ . '\\activation_notice' );
7
ssnepenthe

最も簡単な方法は、コードを波括弧で囲むことです。

namespace myPlugin {

    add_action( 'admin_init', __NAMESPACE__ . '\\add_activation_notice' );

    function add_activation_notice() {
        add_action( 'admin_notice', __NAMESPACE__ . '\\activation_notice' );
    }

    function activation_notice() {
        echo 'Notice!';
    }
}

そうでなければ、あなたのアクションはグローバル名前空間でactivation_notice関数を探すでしょう。

更新

admin_noticeフックはありません。代わりにadmin_noticesを使用してください。試してください:

namespace myPlugin {
    add_action( 'admin_init', __NAMESPACE__ . '\\add_activation_notice');

    function add_activation_notice() {
        add_action( 'admin_notices', __NAMESPACE__ . '\\activation_notice' );
    }

    function activation_notice() {
    ?>
        <div class="notice notice-info is-dismissible">
            <p><?php echo 'Done!'; ?></p>
        </div>
    <?php
    }
}