ADMIN_NOTICES操作不会在SAVE_POST操作内触发

时间:2020-06-10 作者:armadadrive

save_post 动作运行时,我也尝试使用admin_notices 行动,但它不起作用。我做错了什么?

如果我移动admin_notices 在构造函数中执行操作时,它可以正常工作(当然,它会显示管理中不需要的每个页面)。我想这一定是挂钩的逻辑顺序还是嵌套本身?

代码示例:

if (!class_exists(\'CPTToPDF\')) {

  // FPDF library
  require_once(plugin_dir_path(__FILE__) . \'fpdf182/fpdf.php\');

  class CPTToPDF {
    private $pdf;

    public function __construct() {
      add_action(\'save_post\', array($this, \'render_to_pdf\'));
    }

    public function render_to_pdf() {
      //die(\'Render to PDF running...\');
      $this->pdf = new FPDF();
      add_action(\'admin_notices\', array($this, \'admin_notice__success\'));
    }

    public function admin_notice__success() {
      //die(\'Admin notice running...\');
      echo \'<div class="notice notice-success is-dismissable">CPTToPDF: Saved post.</div>\';
    }

    public function admin_notice__error() {
      echo \'<div class="notice notice-error is-dismissable">CPTToPDF: Did not save post.</div>\';
    }
  }

}
我把最初的钩子放进save_post 在插件的构造函数方法中。这很好(如果我取消注释die(\'Render to PDF running...\'); 它确实会消失并显示该消息,所以我知道我的回调工作正常。

然而,第二个动作/钩子在render_to_pdf 回调:add_action(\'admin_notices\', array($this, \'admin_notice__success\'));

即使我取消注释die(\'Admin notice running...\'); 保存帖子并重新加载新页面时,我没有收到任何输出(除了默认的“页面更新。查看页面”管理通知)。所以嵌套操作似乎不起作用,我不知道为什么。

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

您需要通过URL将通知消息(或者可能是一个引用特定标准通知消息的键)发送到下一页。

我建议将其封装在自己的函数中。类似于。。。

public function render_to_pdf() {
    // ... whatever you need to do
      my_trigger_notice( 1 ); // 1 here would be a key that refers to a particular message, defined elsewhere (and not shown here)
    }
然后在函数中添加新函数。php(或admin.php文件):

function my_trigger_notice( $key = \'\' ) {
    add_filter(
        \'redirect_post_location\',
        function ( $location ) use ( $key ) {
            $key = sanitize_text_field( $key );

            return add_query_arg( array( \'notice_key\' => rawurlencode( sanitize_key( $key ) ) ), $location );
        }
    );
}
现在,当页面重定向时,它应该将您的通知键附加到URL上,使下一个页面能够在admin_notice 挂钩(也在functions.php或admin.php中设置):

function my_admin_notices() {
    if ( ! isset( $_GET[\'notice_key\'] ) ) {
        return;
    }
    $notice_key  = wp_unslash( sanitize_text_field( $_GET[\'notice_key\'] ) );
    $all_notices = [
        1 => \'some notice\',
        2 => \'some other notice\',
    ]
    if ( empty( $all_notices[ $notice_key ] ) ) {
        return;
    }
        ?>
    <div class="error">
        <p>
            <?php echo esc_html( $all_notices[ $notice_key ] ); ?>
        </p>
    </div>
    <?php
    }

add_action( \'admin_notices\', \'my_admin_notices\' );

相关推荐

do_action not working in loop

我一直在使用do\\u action在循环中生成多个动作挂钩。对我来说,do\\u操作不起作用似乎很不幸。function ltc_generate_input_fields($fields = array()) { echo \"Hello World\"; if (empty($fields) || !is_array($fields)) return; foreach($fields as $field) { &#