我有一个带有设置页面的插件,在保存某个选项时必须执行一些操作。我正在使用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可能以其他方式传递值?如果是,如何?
哪种方法是正确的,我如何解决这个问题?当然,如果有任何其他方法优于这两种方法并解决了这个问题,那就很受欢迎。
最合适的回答,由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网友: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
}