是的,这是可能的(但很痛苦)。
Wordpress在中运行此行时正在创建管理消息admin-header.php
:
do_action( \'admin_notices\' );
在此之前调用的操作是:
do_action( \'in_admin_header\' );
因此,我们可以在Wordpress呈现消息之前,在那里挂接并运行一些代码进行一些更改以过滤掉消息。
首先创建一个新操作以绑定到\'in_admin_header\'
事件:
add_action(\'in_admin_header\', \'admin_mods_disable_some_admin_notices\');
当插件想要显示管理消息时,他们会添加
admin_notices
\'s回调。如果这些操作返回要显示的HTML而不是仅仅打印它,这将是明智的,但事实并非如此,因此我们需要循环所有回调并为每个回调设置输出缓冲区,以收集生成的HTML,然后检查其中是否包含禁止的字符串。这样,我们就可以取消绑定模块admin\\u通知回调。
例如:
function admin_mods_disable_some_admin_notices() {
// This global object is used to store all plugins callbacks for different hooks
global $wp_filter;
// Here we define the strings that we don\'t want to appear in any messages
$forbidden_message_strings = [
\'The WP scheduler doesn\\\'t seem to be running correctly for Newsletter\'
];
// Now we can loop over each of the admin_notice callbacks
foreach($wp_filter[\'admin_notices\'] as $weight => $callbacks) {
foreach($callbacks as $name => $details) {
// Start an output buffer and call the callback
ob_start();
call_user_func($details[\'function\']);
$message = ob_get_clean();
// Check if this contains our forbidden string
foreach($forbidden_message_strings as $forbidden_string) {
if(strpos($message, $forbidden_string) !== FALSE) {
// Found it - under this callback
$wp_filter[\'admin_notices\']->remove_filter(\'admin_notices\', $details[\'function\'], $weight);
}
}
}
}
}
Wordpress实际上可以实现Druapl的渲染数组之类的东西,从而使这样的事情变得更容易。
LIMITATIONS:
正如TomJ Nowell指出的那样,插件可以在任何时候吐出HTML,而WP javascript会将它们移动到屏幕顶部。由于没有一个API端点来添加所有管理通知,因此几乎不可能可靠地更改所有管理消息。然而,使用这种方法,您至少可以针对任何使用
admin_notices
行动