ACFのショートコードを有効化しても表示されない問題について

ACFのショートコードを有効化しても表示されない問題について

ACF(Advanced Custom Fields)プラグインは、Wordpress標準のカスタムフィールド機能と比べ、より幅広い運用ができるということもあり、使用されている方も多くいらっしゃるのではないでしょうか?

ACFで追加したカスタムフィールドに入力された内容を出力するにはthe_field()get_field()といった関数を使用します。

上記の関数以外にACFのショートコードがあるのですが、このショートコードを使うにあたり少し問題が発生しました。

目次

ACFショートコードはこのサイトでは無効化されています

[acf field="field_name"]

field_nameの部分は[acf field=”name”][acf field=”age”]といったように、各自設定した「フィールド名」を入れるのですが、このショートコードを使うと以下のように表示されてしまいます。

ACFショートコードはこのサイトでは無効化されています
ACFショートコードはこのサイトでは無効化されています

よくよく調べてみると、ACFのバージョン6.3.0以降はセキュリティの観点からデフォルトで無効になっているようです。

ACFショートコードを有効化する

そして、さらに調べると、この無効化されたショートコードを有効化する方法がACFの公式サイトに記載されていました。

add_action( 'acf/init', 'set_acf_settings' );
function set_acf_settings() {
    acf_update_setting( 'enable_shortcode', true );
}

このアクションフックを使うことで、ショートコードが有効化されるということなんですが…

有効化しても表示されない

ACFショートコードを有効化して問題解決!と思ったら、このような表示が出ました。

ACFフィールドは出力できません
ACFフィールドは出力できません

[The requested ACF field is not allowed to be output in bindings or the ACF Shortcode.]

といった表示が出てしまいました…

Google翻訳を使って訳してみると「要求されたACFフィールドは、バインディングまたはACFショートコードで出力できません。」といった内容です。

ACF用のショートコードを自作

function original_acf_shortcode($atts){
	global $post;
  extract(shortcode_atts(array(
    'field' => '',
  ),$atts));

  $val = get_field($atts['field'],$post->ID);
  return $val;
}
add_shortcode('acf','original_acf_shortcode');

ACF公式サイトにも記載されていたのですが、そもそもACFのショートコードは単純なテキストベースの値に対してのみ機能するもののようなので、今回、自作したショートコードも同様の基準で作成しています。

ACFフィールドの値がプレビューで表示されない

実際に、ACFのフィールドを設定し、適当にテキストを入れてプレビューにて表示確認したところ、何も表示がされませんでした。ただ、投稿内容を「下書き保存」ではなく、「公開」にしてページを確認すると表示はされますので、プレビュー表示のときに何か不具合があるようです。

調べてみると、こちらのページhttps://e-joint.jp/blog/2251に解決策が載っておりました。

そのページには以下のソースコードが書かれており、functions.phpに貼り付けると、無事にプレビューでもショートコードで取得した値が表示されました。

function fix_post_id_on_preview($null, $post_id) {
  if (is_preview()) {
    return get_the_ID();
  }else{
    $acf_post_id = isset($post_id->ID) ? $post_id->ID : $post_id;

    if (!empty($acf_post_id)) {
      return $acf_post_id;
    }else{
      return $null;
    }
  }
}
add_filter( 'acf/pre_load_post_id', 'fix_post_id_on_preview', 10, 2 );

ACFの仕様なのか何なのか、どうもプレビュー表示する際に参照する投稿IDが違うようなので、このソースコードで正しい投稿IDをACFに渡すといった形にしているようです。

この記事を投稿した時点(ACF バージョン6.4.2)では、プレビュー表示に関する不具合は解消されていないので、ひとまず上記の方法で対応しておくのがいいかなと思います。