Advanced Custom Fieldsは非常に便利なのだけど、散々作りこんだ挙句にプレビュー出来ないことに気付いた。
今後も使い続けたいので、何とか解決方法を見つけようと四苦八苦・・・。
キレイな方法ではできなかったけど、一応下記のやり方で目的は達せられた。
step1.
SESSIONを使うので、/wp-config.phpの最後に以下を追記
if (!session_id()) session_start();
step2.
プレビューを押されたときのアクションにフックする。
使用しているthemeフォルダ内のfunctions.phpに追記。
function myCfPrev(){ if ( !empty($_POST)){ $_SESSION['posts'] = myHtmlSpecialChars($_POST); } } add_action( 'wp_insert_post', 'myCfPrev' ); // myHtmlSpecialCharsは配列の中もHTML エンティティに変換。不要なら外す。 function myHtmlSpecialChars($string) { if (is_array($string)) { return array_map("myhtmlspecialchars", $string); } else { return htmlspecialchars($string, ENT_QUOTES); } }
プレビューボタンを押すと、Advanced Custom Fieldsを使って追加したフィールドは、「field_数字」という名前で$_POSTに格納される。
本来のフィール名との結び付けができなかったので、Wordpressの投稿画面のソース(Firebugなど使うと便利)から、Advanced Custom Fieldsを使って作成したinputフォームなどを調べ、イチイチ取得しなければならなかった。
上記で$_SESSION[‘posts’][‘fields’][‘field_数字’]にそれぞれのデータを格納できる。
また、$_SESSION[‘wp-preview’]に、「dopreview」が入る。
更新ボタンをクリックした場合は、$_SESSION[‘wp-preview’]は空。
$_SESSION[‘wp-preview’]の値を調べて条件分岐し、プレビューの場合はプレビューデータを表示するようにする。
画像の場合は、もう少し手間をかける。
画像のURLを格納したwp-postのpost_idが格納されているので、その値を使えばいい。
例えばこんな感じで。
$img_url = wp_get_attachment_image( $_SESSION['posts']['fields']['field_数字],'full', false );
もっとスマートなやり方があればいいのだけど、今の自分ではこれがやっと。
面倒なやり方だけど、手も足も出ない状況からは脱却できたので、メモ。