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