Я добавляю проверку, поэтому, если сообщение находится в определенной категории, ему нужно установить определенные настраиваемые поля.
Это должно быть легко подключить 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