カスタムフィールドの内容がプレビュー時に反映されない

ACF(Advanced Custom Fields)に内容がプレビューに反映されないとき。

functions.phpに下記追加で解消

/*-------------------------------------------*/
/* カスタムフィールドもプレビューできるようにする */
/*-------------------------------------------*/

function get_preview_id($postId) {
  global $post;
  $previewId = 0;
  if ( isset($_GET['preview']) && ($post->ID == $postId) && $_GET['preview'] == true && ($postId == url_to_postid($_SERVER['REQUEST_URI'])) ) {
    $preview = wp_get_post_autosave($postId);
    if ($preview != false) { $previewId = $preview->ID; }
  }
  return $previewId;
}

add_filter('get_post_metadata', function($meta_value, $post_id, $meta_key, $single) {
  if ($preview_id = get_preview_id($post_id)) {
    if ($post_id != $preview_id) {
      $meta_value = get_post_meta($preview_id, $meta_key, $single);
    }
  }
  return $meta_value;
}, 10, 4);

add_action('wp_insert_post', function ($postId) {
  global $wpdb;
  if (wp_is_post_revision($postId)) {
    if (count($_POST['fields']) != 0) {
      foreach ($_POST['fields'] as $key => $value) {
        $field = get_field($key);
        if ( !isset($field['name']) || !isset($field['key']) ) continue;
        if (count(get_metadata('post', $postId, $field['name'], $value)) != 0) {
          update_metadata('post', $postId, $field['name'], $value);
          update_metadata('post', $postId, "_" . $field['name'], $field['key']);
        } else {
          add_metadata('post', $postId, $field['name'], $value);
          add_metadata('post', $postId, "_" . $field['name'], $field['key']);
        }
      }
    }
    do_action('save_preview_postmeta', $postId);
  }
});

参考:ACF(カスタムフィールド)を使ってもプレビューを有効にする - ドットワン合同会社


これでうまくいかないときは、下記も追加

// カスタム投稿タイプのリビジョンを有効にする(プレビューに反映させる)
function my_custompost_rv() {
  add_post_type_support( 'page', 'revisions' );
}
add_action('init', 'my_custompost_rv');

pageの部分はカスタム投稿タイプ名にするらしいけど、なんかてきとうでもうまくいった。

今回は固定ページを想定してpageにしてある。

参考:ほめぶろ

以上!これで終わり!

ジャンプできる目次

御託

解決できたならこの先読まなくてもいいけど、一応書いておく。

原因

WordPressのプレビュー機能が、デフォルトの状態ではカスタムフィールドのメタデータを正しく扱わないためです。プレビュー時には、投稿のリビジョン(修正履歴)が表示されるのですが、カスタムフィールドのメタデータはリビジョンに含まれないため、プレビュー画面に反映されません。

解決策として記事に記載されているコードは、プレビュー時にリビジョンIDではなくオートセーブされたリビジョンのIDを利用してメタデータを取得するように変更しています。これにより、カスタムフィールドの内容もプレビュー画面に正しく表示されるようになります。

また、カスタム投稿タイプに対してリビジョン機能を有効にすることで、カスタム投稿タイプの内容もプレビューに反映されるようになります。

このように、プレビュー機能の仕組みとカスタムフィールドのメタデータの取り扱いに関連する制約が、カスタムフィールドの内容がプレビュー時に表示されない原因となっています。知らんけど。

解決策

冒頭に記載した解決策は、主に二つの部分から成り立っています。

オートセーブされたリビジョンのIDを利用: この部分のコードは、プレビュー時にオートセーブされたリビジョンのIDを利用してメタデータを取得し、カスタムフィールドの内容をプレビュー画面に正しく表示するためのものです。

カスタム投稿タイプのリビジョン機能を有効化: この部分のコードは、カスタム投稿タイプに対してリビジョン機能を有効にし、カスタム投稿タイプの内容もプレビューに反映させるためのものです。知らんけど。

このブログのWordPressテーマはこれ

2022年現在、当サイトではDirverを利用しています。

こんな風にページ最下部の広告を複数パターンを登録して、記事ごとに選ぶこともできます。

効率化を重視するあまり、準備だけで疲弊していませんか?

 

時給換算すると有料テーマを買ったほうが、費用対効果も高いです。

 

Driver運営のサポートがとても親切で、わからないこともメールで聞けばすぐに教えてくれます。

「何サイトまでしか使いまわしてはいけない」なんてセコいことも言いません。

 

ぜひ、詳細を覗てみてください。

おすすめの記事