Wordpress: отображение сообщения об ошибке - сбой хука admin_notices на wp_insert_post_data или publish_post

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

Это должно быть легко перехватывать 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');

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

Что я делаю неправильно?


person willoller    schedule 07.08.2009    source источник


Ответы (3)


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

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

person Richard M    schedule 07.08.2009

Вы можете просто сделать как WordPress: используя transients следующим образом:

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");

пс: избегайте $_SESSION в WordPress, спасибо

person Julio Potier    schedule 06.11.2013

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

Это условие всегда TRUE, поэтому оно всегда сбрасывает переменную $_SESSION['admin_notices']

person DarkStar    schedule 07.07.2011
comment
Не совсем так - присвоение оценивается (как значение, которое было присвоено), поэтому оно вернет false, если $_SESSION['admin_notices'] также равно false или !isset(). sitepoint.com/assignment-inside-a-condition - person willoller; 07.07.2011