public static function update_notice() {
echo "<div class='error'><p>Failed to retrieve coordinates. Please check key and address.<p></div>";
remove_action('admin_notices', 'update_notice');
}
add_action('admin_notices', array('GeoPost', 'update_notice'));
我不确定我是在错误使用还是在错误的上下文中使用。需要明确的是,在实际代码中,add_action位于同一类的另一个函数中。很好。
#1 楼
之所以不起作用,是因为在save_post操作之后发生了重定向。可以实现所需的一种方法是通过使用查询var来实现快速解决方案。 />希望这对您有所帮助。干杯
评论
效果很好,谢谢!但是公共函数admin_notices()的第一行缺少一个右括号(if(!isset(..行)
– Rhys Wynne
15年1月28日在16:04
我添加了remove_query_arg('YOUR_QUERY_VAR');正如我发现它可以从最近的更新设置。
–托尼·奥哈根(Tony O'Hagan)
18年7月6日在8:12
+1好答案。
–马克
18年8月7日在7:35
#2 楼
针对这种情况制作了包装器类。实际上,该类可以在涉及显示通知的任何情况下使用。我使用PSR标准,因此命名是非典型的Wordpress代码。
class AdminNotice
{
const NOTICE_FIELD = 'my_admin_notice_message';
public function displayAdminNotice()
{
$option = get_option(self::NOTICE_FIELD);
$message = isset($option['message']) ? $option['message'] : false;
$noticeLevel = ! empty($option['notice-level']) ? $option['notice-level'] : 'notice-error';
if ($message) {
echo "<div class='notice {$noticeLevel} is-dismissible'><p>{$message}</p></div>";
delete_option(self::NOTICE_FIELD);
}
}
public static function displayError($message)
{
self::updateOption($message, 'notice-error');
}
public static function displayWarning($message)
{
self::updateOption($message, 'notice-warning');
}
public static function displayInfo($message)
{
self::updateOption($message, 'notice-info');
}
public static function displaySuccess($message)
{
self::updateOption($message, 'notice-success');
}
protected static function updateOption($message, $noticeLevel) {
update_option(self::NOTICE_FIELD, [
'message' => $message,
'notice-level' => $noticeLevel
]);
}
}
:add_action('admin_notices', [new AdminNotice(), 'displayAdminNotice']);
AdminNotice::displayError(__('An error occurred, check logs.'));
该通知仅显示一次。
#3 楼
除了@jonathanbardo的答案很好而且功能很好之外,如果要在加载新页面后删除查询参数,则可以使用可移动查询_过滤器。您将获得一个参数名称数组,可以在其中附加自己的参数。然后WP将负责从URL中删除列表中的所有参数。public function __construct() {
...
add_filter('removable_query_args', array($this, 'add_removable_arg'));
}
public function add_removable_arg($args) {
array_push($args, 'my-query-arg');
return $args;
}
类似的东西:
'...post.php?post=1&my-query-arg=10'
将成为:
'...post.php?post=1'
#4 楼
基于get_settings_errors()
的简单,优雅。function wpse152033_set_admin_notice($id, $message, $status = 'success') {
set_transient('wpse152033' . '_' . $id, [
'message' => $message,
'status' => $status
], 30);
}
function wpse152033_get_admin_notice($id) {
$transient = get_transient( 'wpse152033' . '_' . $id );
if ( isset( $_GET['settings-updated'] ) && $_GET['settings-updated'] && $transient ) {
delete_transient( 'wpse152033' . '_' . $id );
}
return $transient;
}
用法
在您的帖子请求处理程序中:
wpse152033_set_admin_notice(get_current_user_id(), 'Hello world', 'error');
wp_redirect(add_query_arg('settings-updated', 'true', wp_get_referer()));
您想在其中使用管理通知的位置,通常在
admin_notices
挂钩中。$notice = $this->get_admin_notice(get_current_user_id());
if (!empty($notice) && is_array($notice)) {
$status = array_key_exists('status', $notice) ? $notice['status'] : 'success';
$message = array_key_exists('message', $notice) ? $notice['message'] : '';
print '<div class="notice notice-'.$status.' is-dismissible">'.$message.'</div>';
}
评论
我开发了一个脚本,可让您轻松添加可解除/静态管理员通知github.com/askupasoftware/wp-admin-notification