更新插件设置后如何显示管理通知?

时间:2018-01-13 作者:DavidTonarini

我有一个带有设置页面的插件,在保存某个选项时必须执行一些操作。我正在使用pre_update_option_ 钩子来做这个。到目前为止还不错。但是,如果出现问题,我还需要通知用户。我试过这些东西:

1) Add hook to admin_notices before updating the code

add_action (\'pre_update_option_my_var\', function( $new_value, $old_value) {
    //Do my validation
    $valid = ( \'correct_value\' == $new_value );

    if ( !$valid ) add_action(\'admin_notices\', \'my_notification_function\' )
    return ($valid)? $new_value : $old_value;
});
验证工作正常,但不会显示通知,因为我假设,到那时,连接到admin_notices 是否已执行?

2) 连接到admin\\u notices的函数中的验证要解决上述问题,我有这个想法。

add_action(\'admin_notices\', function () {

      //Do my validation
      $valid = ( \'correct_value\' == $_POST[\'my_var\'] );
      if (!$valid) { /* Display error message */ }
      //Store the value of $valid
});

add_action (\'pre_update_option_my_var\', function( $new_value, $old_value) {
    //fetch the value of $valid which I stored 
    return ($valid)? $new_value : $old_value;
});
现在,这似乎很有效,我现在确实看到了通知。问题是,出于某种奇怪的原因,我没有看到发布的值。我试着打印$_POST 它总是空的!WordPress可能以其他方式传递值?如果是,如何?

哪种方法是正确的,我如何解决这个问题?当然,如果有任何其他方法优于这两种方法并解决了这个问题,那就很受欢迎。

4 个回复
最合适的回答,由SO网友:DavidTonarini 整理而成

在深入研究设置API后,我找到了答案。方法1正确,但不应通过挂接admin_notices, 而是通过功能add_settings_error

add_action (\'pre_update_option_my_var\', function( $new_value, $old_value) {
    //Do my validation
    $valid = ( \'correct_value\' == $new_value );

    if ( !$valid ) {
         //This fixes the issue
         add_settings_error( \'my_var\', $error_code, $message );
    }
    return ($valid)? $new_value : $old_value;
});
为了显示它们,还需要在设置页面的开头添加以下内容:

<h2>The heading of my settings page</h2>
<?php settings_errors(); ?>

SO网友:Armando Duran

几个月前,我遇到了同样的挑战。我需要根据对自定义帖子类型中的一些自定义字段进行的某些验证来显示管理员通知。

因为我的验证是在pre\\u save钩子中进行的,所以问题是“钩子触发后浏览器会刷新”

因此,我找到了一个由John Oleksowicz编写的类,它基本上将管理通知存储在选项表上,并在不需要时清除它。

它被称为:Easy WordPress Admin Notifications

这个类非常简单,你可以直接使用插件。在我的例子中,我使用了这个类,并通过改变调用管理消息函数的方式对其进行了调整。

所以现在,每当我需要触发管理员通知时,我都会:

planner_notices_add_error( $message );

SO网友:KAGG Design

不,你做错了。add_action 必须在中__construct() 插件对象的。这是我的小插件的摘录WOOF by Category, 您可以从wordpress下载整个代码。组织机构:

public function __construct() {
    //...
    add_action( \'admin_notices\', array( $this, \'wbc_plugin_not_found\' ) );
    //...
}
在我的代码中,我检查一个条件(验证-在您的情况下),并通过返回结果wbc_requirements_met(). 如果结果为false,则添加通知消息wbc_admin_message

public function wbc_plugin_not_found() {
    if ( $this->wbc_requirements_met() ) {
        return;
    }

    $message = __( \'WOOF by Category plugin requires the following plugins installed and activated: \', \'woof-by-category\' );
    //...
    $this->wbc_admin_message( $message, \'error notice is-dismissible\' );
    }

private function wbc_admin_message( $message, $class ) {
    ?>
    <div class="<?php echo esc_attr( $class ); ?>">
        <p>
            <span style="display: block; margin: 0.5em 0.5em 0 0; clear: both;">
            <?php echo wp_kses( $message, wp_kses_allowed_html( \'post\' ) ); ?>
            </span>
        </p>
    </div>
    <?php
}

SO网友:Grzegorz Rola

我们为Wordpress管理通知编写了小型库:https://gitlab.com/wpdesk/wp-notice

现在显示管理通知就像创建新对象一样简单:

$notice = new \\WPDesk\\Notice\\Notice( \'info\', \'Notice text goes here\' );

结束

相关推荐

限制对Options-*.php页面的访问

我有一个名为manager 具有manage_options 和read 功能,我想限制他不要访问设置菜单,你可以说删除manage_options 功能,但事实并非如此,因为我需要这个cap(我使用的是发布到options.php的设置API)。我可以使用remove_menu_page() 但我们仍然可以通过直接键入url进行访问。