我正在尝试从pre_insert_term过滤器中触发一个管理通知(也尝试过作为一个操作)。示例:
add_filter( 'pre_insert_term', 'pre_insert_term_action', 10, 2 );
function pre_insert_term_action( $term, $taxonomy ) {
add_action( 'admin_notices', 'show_example_error' );
return $term;
}
function show_example_error() { ?>
My example warning message.所以我在我的帖子中添加了一个标签并点击了更新按钮,但是它并没有像预期的那样显示管理通知。如果我将die()调用放在两个函数中,它将显示这些函数正在按预期运行,首先是上面的pre_insert_term_action(),然后是show_example_error()。
当我将admin_notices操作添加到pre_insert_term_action()函数范围之外时,管理员通知就会显示出来。那么,如果函数是按预期顺序启动的,那么如果在第一个触发函数中添加了操作,为什么我的管理通知不显示呢?
在这个相关的问题中有一个公认的答案,建议使用add_settings_error(),但这并没有做任何我能明显看到的事情。
我还发现奇怪的是,如果我在我的$GLOBALS函数中定义了一个pre_insert_term_action()变量,那么当我在show_example_error()中调用它时,它不会返回一个值。
发布于 2019-09-25 18:57:31
因此,看起来在更新后的过程中有一些页面重定向,因此我甚至不能访问$GLOBALS变量。我发现使用的唯一替代方法是使用会话变量。类似于:
add_filter( 'pre_insert_term', 'pre_insert_term_action', 10, 2 );
add_action( 'admin_notices', 'show_example_error' );
function pre_insert_term_action( $term, $taxonomy ) {
if ( MY CONDITION THAT WARRANTS A WARNING NOTICE IS TRUE ) {
if ( session_id() === '' || ! isset($_SESSION) ) {
session_start();
}
$_SESSION['show_my_error_message'] = true;
return new WP_Error( 'code', 'message' );
}
return $term;
}
function show_example_error() {
if ( session_id() === '' || ! isset($_SESSION) ) {
session_start();
}
if ( isset($_SESSION['show_my_error_message']) ) {
?>
My example warning message.发布于 2019-09-24 21:08:09
我会去做这样的事:
function my_notices() {
$screen = get_current_screen();
if ($screen->id === 'your-id') { //or anything else
if (isset($_GET['save'])) { // or $_SESSION or transient
My example warning message.让我们看看WP屏幕对象。https://codex.wordpress.org/Class_参考/可湿性粉剂_屏幕
编辑您可以使用$_GET、$_SESSION或检查在save_post操作或类似操作期间设置的瞬变项,如pre_insert_term筛选器。很好的解释。
https://wordpress.stackexchange.com/questions/348981
复制相似问题