[英]Wordpress: displaying an error message - hook admin_notices fails on wp_insert_post_data or publish_post
我正在添加验证,因此如果帖子属于特定类别,则需要设置某些自定义字段。
这应该很容易挂钩wp_insert_post_data
和admin_notices
,但是有一个重定向会导致admin_notices
回调消失。
好的 - 所以我创建了一个使用Session在重定向中存储我的错误消息的hack:
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一样做:使用这样的瞬态 :
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:在WordPress中避免$ _SESSION,thx
Wordpress不使用会话,如果启用了register_globals
,它将清除$_SESSION
数组。
Wordpress使用URL中的message
整数传递它的消息,然后在wp-admin
文件夹中的相关edit-[type]-form.php
文件中定义消息数组。 我想你可能会将自己的变量附加到重定向,然后在你的admin_notices
钩子函数中得到它。 看看edit-[type]-form.php
文件,了解这可能是如何工作的。
if($out = $_SESSION['admin_notices']) {
$_SESSION["admin_notices"] = "";
echo $out;
}
此条件始终为TRUE,因此它始终会重置$ _SESSION ['admin_notices'] var
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.