ADMIN_NOTES不能在POST编辑器中工作

时间:2019-09-24 作者:Talk Nerdy To Me

我正试图在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() { ?>
    <div class="error">
        <p>My example warning message.</p>
    </div>
<?php }
因此,我在帖子中添加了一个标签,并点击了更新按钮,但它并没有像预期的那样显示管理员通知。如果我把die() 在这两个函数中调用,它向我显示函数正在按预期启动,首先pre_insert_term_action() 那么在上面show_example_error().

当我添加admin_notices 操作超出pre_insert_term_action() 功能范围,则会显示管理通知。那么,如果函数按预期顺序启动,为什么我的管理通知没有显示是否在第一个启动函数中添加了操作?

有一个公认的答案this related question 建议使用add_settings_error() 但这并没有做任何我看得出来的事情。

我还发现,如果我定义$GLOBALS my中的变量pre_insert_term_action() 函数,当我调用它时它不会返回值show_example_error().

2 个回复
最合适的回答,由SO网友:Talk Nerdy To Me 整理而成

因此,在更新后的过程中,似乎有一些页面重定向正在进行,因此我甚至无法访问$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\']) ) {
        ?>
        <div class="error">
            <p>My example warning message.</p>
        </div>
        <?php
        unset($_SESSION[\'show_my_error_message\']);
    }
}

SO网友:middlelady

我喜欢这样的东西:

function my_notices() {
      $screen = get_current_screen();
      if ($screen->id === \'your-id\') { //or anything else
        if (isset($_GET[\'save\'])) { // or $_SESSION or transient

          <div class="error">
            <p>My example warning message.</p>
          </div>

        <?php }
      }
}
add_action(\'admin_notices\', \'my_notices\');
让我们也来看看WP Screen对象。https://codex.wordpress.org/Class_Reference/WP_Screen

编辑您可以使用$_GET, $_SESSION 或检查在save_post 操作或类似操作,如pre_insert_term 滤器Good explanation here.