Wordpress: отображение сообщения об ошибке - уведомления администратора о блокировке не удается в wp вставить данные публикации или опубликовать публикацию
Я добавляю проверку, поэтому, если сообщение относится к определенной категории, для него необходимо задать определенные настраиваемые поля.
Это должно быть легко подключить wp_insert_post_data
и admin_notices
, но есть перенаправление, которое приводит к исчезновению обратного вызова admin_notices
.
ХОРОШО - Итак, я создал хак, который использует сеанс для хранения моего сообщения об ошибке в перенаправлении:
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');
Вопрос в следующем: почему я должен проходить через все это безумие, чтобы выдать сообщение об ошибке?
Что я делаю не так?
3 answers
Wordpress не использует сеансы, и если register_globals
включен, он очистит массив $_SESSION
.
Wordpress передает свои сообщения, используя целое число message
в 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