WordPress: отображение сообщения об ошибке – hook admin_notices завершается с ошибкой по wp_insert_post_data или publish_post

Я добавляю проверку, поэтому, если сообщение находится в определенной категории, ему нужно установить определенные настраиваемые поля.

Это должно быть легко подключить wp_insert_post_data и admin_notices , но есть перенаправление, из-за admin_notices обратный вызов admin_notices исчезает.

OK. Итак, я создал хак, который использует сеанс для хранения моего сообщения об ошибке через перенаправление:

 function set_post_pending($data, $postarr) { // If it's not valid... $error = "You are missing some Custom Fields."; $_SESSION['admin_notices'] = $error; $data['post_status'] = 'pending'; return $data; } add_filter('wp_insert_post_data', 'set_post_pending',1,2); function session_admin_notice() { if($out = $_SESSION['admin_notices']) { $_SESSION["admin_notices"] = ""; echo $out; } return false; } add_action('admin_notices', "session_admin_notice"); 

Проблема с этим решением заключается в том, что некоторые, как сеанс недоступен при вызове session_admin_notice , который имеет простое (но безумное ) решение:

 public static function fix_session_bs() { // TODO: Why do I have to do this? if(!session_id() && $_COOKIE["PHPSESSID"]) { session_start($_COOKIE["PHPSESSID"]); } } add_action('admin_init', 'fix_session_bs'); 

Вопрос в том, почему я должен пройти все это безумие, чтобы выдать сообщение об ошибке?

Что я делаю не так?

WordPress не использует сеансы, и если register_globals включен, он очистит массив $_SESSION .

WordPress передает свои сообщения вместе с использованием целых чисел в URL-адресе, затем в соответствующем файле edit-[type]-form.php папке wp-admin определяется массив сообщений. Я думаю, вы могли бы добавить свою собственную переменную в перенаправление, а затем получить ее в своей функции admin_notices . Взгляните на файлы edit-[type]-form.php чтобы понять, как это может работать.

Вы можете просто сделать так, как WordPress: с помощью таких переходных процессов :

 function set_post_pending($data, $postarr) { // If it's not valid... $error = "You are missing some Custom Fields."; set_transient( get_current_user_id().'missingfield', $error ); $data['post_status'] = 'pending'; return $data; } add_filter('wp_insert_post_data', 'set_post_pending',1,2); function show_admin_notice() { if($out = get_transient( get_current_user_id().'missingfield' ) ) { delete_transient( get_current_user_id().'missingfield' ); echo "<div class=\"error\"><p>$out</p></div>"; } // return false; // nothing to return here } add_action('admin_notices', "session_admin_notice"); 

ps: избегать $ _SESSION в WordPress, thx

 if($out = $_SESSION['admin_notices']) { $_SESSION["admin_notices"] = ""; echo $out; } 

Это условие всегда ИСТИНА, поэтому он всегда перезагружает ваш $ _SESSION ['admin_notices'] var