私は自分のプラグインに名前を付けることにしました、そして私は私のメインプラグインファイルを除いて、それがすべてうまくいくようにしました。
プラグインの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_notice
とactivation_notice
の2つの関数は、myPlugin
名前空間にあります。私がクラス内でオンライン参照メソッドを見つけたコードのほとんどは、私はプラグインのアクティベーション通知を持つことができるように、これらはクラス外にある必要があります。
編集:
とやってみると
add_action( 'admin_init', \add_activation_notice() );
私は
致命的なエラー :不明なエラー:未定義の関数add_activation_notice()を呼び出しています
この道を進みすぎる前に、 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' );
最も簡単な方法は、コードを波括弧で囲むことです。
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
}
}