I'm adding validation so if a post is in a particular category, it needs certain Custom Fields to be set.
This should be easy hooking wp_insert_post_data
and admin_notices
, but there is a redirect that causes the admin_notices
callback to disappear.
OK - So I created a hack that uses the Session to store my error message across the redirect:
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");
The problem with this solution is that somehow the session is not available when calling session_admin_notice
, which has an easy (but crazy) solution:
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');
The question is: Why do I have to go through all this craziness to throw an error message?
What am I doing wrong?
This condition is always TRUE so it always reset your $_SESSION['admin_notices'] var
Wordpress doesn't use sessions, and if
register_globals
is on it will clear the$_SESSION
array.Wordpress passes it's messages along using a
message
integer in the URL, an array of messages is then defined in the relevantedit-[type]-form.php
file in thewp-admin
folder. I think you could probably append your own variable to the redirect and then get that in youradmin_notices
hook function. Take a look at theedit-[type]-form.php
files to get an idea of how this might work.You can simply do like WordPress do : using transients like this :
ps : avoid $_SESSION in WordPress, thx