Wordpress:显示错误消息 - 钩子admin_notices在wp_insert_post_data或publish_post上失败

时间:2009-08-07 00:49:21

标签: php wordpress plugins session hook

我正在添加验证,因此如果帖子属于特定类别,则需要设置某些自定义字段。

这应该很容易挂钩wp_insert_post_dataadmin_notices,但有一个重定向会导致admin_notices回调消失。

好的 - 所以我创建了一个hack,它使用Session在重定向中存储我的错误消息:

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'); 有一个简单的(但疯狂的)解决方案:< / p>

{{1}}

问题是:为什么我必须经历所有这些疯狂的错误信息?

我做错了什么?

3 个答案:

答案 0 :(得分:7)

你可以像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");

ps:避免WordPress中的$ _SESSION,thx

答案 1 :(得分:3)

Wordpress不使用会话,如果启用了register_globals,它将清除$_SESSION数组。

Wordpress在URL中使用message整数传递消息,然后在edit-[type]-form.php文件夹中的相关wp-admin文件中定义消息数组。我想你可以将自己的变量附加到重定向,然后在你的admin_notices钩子函数中得到它。查看edit-[type]-form.php文件,了解这可能有用。

答案 2 :(得分:1)

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

此条件始终为TRUE,因此它始终会重置$ _SESSION ['admin_notices'] var