WEBサイト作成時に発生するエラーやトラブル対応の備忘録を中心に、いろいろと書いております。


ACFproで作成したカスタムブロックで記事に投稿した内容をアーカイブページで引っ張る方法

たとえば、カスタム投稿タイプ(商品)の投稿ページに
ブロック:「商品」(iteminfo)
フィールド:メーカー(maker)・値段(price)
というカスタムブロックを作ってデータを入れた場合、
商品というカスタム投稿タイプのアーカイブページに、タイトルとアイキャッチと値段を表示させたい場合、カスタムブロックで登録した内容は、記事の「post_content」に「データ」で入れられるため、「データ」から値を引っ張る必要があります。

その方法。

まず、function.phpに以下を追加

function content_to_field( $fieldname = "", $blockname = ""){

  $post_content = get_post_field('post_content', get_the_ID());
  $pattern = '/<!-- wp:acf\/'.$blockname.' {"name":"acf\/'.$blockname.'","data":(.*?),"mode":"(.*?)"} \/-->/';
  preg_match($pattern, $post_content, $matches);

  $jsonString = $matches[1];
  #echo $jsonString;
  if (!empty($jsonString)) {
      $block_data = json_decode($jsonString, true);
      echo $block_data[$fieldname];
  }
}

$fieldnameには取得したいフィールド名(例では「price」)、$blocknameには取得したい対象ブロック名(例では「iteminfo」)を入れるようにします。

表示側のテンプレートファイルには

<?php content_to_field($fieldname, $blockname);?>

と記述。つまり、例だと content_to_field(‘price’, ‘iteminfo’) と記述

懸念事項としては、今後開発とともに、post_contentsに収められるデータ形式が変わらないかということ。

$pattern = '/<!-- wp:acf\/'.$blockname.' {"name":"acf\/'.$blockname.'","data":(.*?),"mode":"(.*?)"} \/-->/';

が変わったらデータは空になりますので、空になってもある程度大丈夫なことにしか使いたくない……。

こちらのページをちゃんと読む必要があるなぁとは思っている。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


This site uses Akismet to reduce spam. Learn how your comment data is processed.