2009-08-07 3 views
4

投稿が特定のカテゴリにある場合、特定のカスタムフィールドを設定する必要があります。Wordpress:エラーメッセージを表示する - wp_insert_post_dataまたはpublish_postでフックadmin_noticesが失敗する

wp_insert_post_dataadmin_noticesをフックするのは簡単ですが、admin_noticesコールバックが消えるリダイレクトがあります。

OK - だから私はリダイレクト全体に私のエラーメッセージを格納するためのセッションを使用してハックを作成しました:

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

質問は:なぜ私は、ERをスローするように、すべてのこの狂気を通過する必要がありますメッセージですか?

私は間違っていますか?

答えて

3

Wordpressはセッションを使用せず、register_globalsがオンの場合は$_SESSIONの配列を消去します。

Wordpressは、URLにmessage整数を使用してメッセージを渡すと、wp-adminフォルダ内の関連するedit-[type]-form.phpファイルにメッセージの配列が定義されます。私はおそらくあなたのリダイレクトに自分の変数を追加し、あなたのadmin_noticesフック関数でそれを得ることができると思う。 edit-[type]-form.phpファイルを見て、これがどのように機能するかを知ることができます。それは常にあなたの$ _SESSION [ 'admin_notices'] VARをリセットするよう

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

この条件は常にTRUEであるあなたは、単にワードプレスのように行うことができます

+0

正確には、割り当ては(割り当てられた値として)評価されるので、 'fals '$ _SESSION ['admin_notices']'が 'false'か'!isset() 'の場合は' e'を返します。 http://www.sitepoint.com/assignment-inside-a-condition/ – willoller

6

が行います。このよう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:ワードプレスで$ _SESSIONを避ける

関連する問題