Advanced Custom Fieldsのデータをプレビューしたい

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

もっとスマートなやり方があればいいのだけど、今の自分ではこれがやっと。
面倒なやり方だけど、手も足も出ない状況からは脱却できたので、メモ。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする