長い題だな。全部入りみたいな。今回はかなり悩んで解決したので、忘れない様に書いておくことにしました。

今回のケース

  • カスタム投稿(menu)を作成し、カスタムタクソノミーとデフォルトのタグを利用する。
  • 投稿のタイトルはメニュー名とし、カスタムフィールドで税抜価格と税込価格を入力する。
  • 投稿ページおよび、固定ページに設置したクエリーループブロック内で、税抜価格と税込価格も表示する。

利用するプラグイン

Lazy Blocksの無料版のみ、ACFは利用しない

カスタム投稿の作成(functions.php)

	register_post_type(
		'menus',
		array(
			'label' => 'メニュー',
			'public' => true,
			'has_archive' => false,
			'show_in_rest' => true,
			'show_in_menu' => true,
			'menu_position' => 5,
			'supports' => array('title', 'editor', 'thumbnail', 'revisions'),
		)
	);

カスタムタクソノミーを追加(functions.php)

register_taxonomy(
		'menu_item',
		array('menus'),
		array(
	      	'hierarchical' => true,
	      	'label' => 'カテゴリー',
	      	'show_ui' => true,
	      	'public' => true,
	      	'show_in_rest' => true
	      ),
	);

タグ機能を有効にする(functions.php)

//カスタム投稿にタグ機能を追加
add_action( 'init', function () {
    register_taxonomy( 'post_tag', [ 'post', 'menus' ],
        [
            'hierarchical' => false,
            'query_var'    => 'tag',
        ]
    );
});
add_action('pre_get_posts', function ($query){
    if ( is_admin() && ! $query->is_main_query() ) {
        return;
    }
    if ( $query->is_category() || $query->is_tag() ) {
        $query->set('post_type', ['post','menus']);
    }
});

Lazy Blocksにカスタムブロックを追加する

クエリーループブロック内にカスタムフィールドを表示させるために、「WordPress 6.5に組み込まれたBlock Bindings API」を利用することにしましたが。エディター上には表示できたのに、画面に反映しませんでした。

試行錯誤で、今回は以下の方法で表示できました。
カスタムブロックの「Control」側の設定にある「Save in Meta」にチェックを入ます(デフォルトでは「Save in Meta」のチェックは入っていません)。そして表示用コードも、Post Metaとして表示させます。

表示用コード(Output Method)は、「HTML+Handlbars」「PHP」「Theme Template」の3種類があります。」「Theme Template」は、テーマ内にすべての記述が収まるので、自由度の高い方法ですが、一番とっつきやすいのはPHPでしょう。基本のコードは以下のような形をとります。

<div class="price">
    <?php echo esc_html( $attributes['price'] ); ?><span>円(税込 <?php echo esc_html( $attributes['price_taxin'] ); ?>円)</span>
</div>

「Save in Meta」にチェックを入れた場合は、上記は以下の様に書く必要があります。コードを見ればわかりますが、カスタム・メタ・フィールド(get_lzb_meta)の値を表示する仕組みになります。

<?php
$price = get_lzb_meta( 'price' );
$price_taxin = get_lzb_meta( 'price_taxin' );
if ( $price ) {
    echo '<div class="price">' . esc_html( $price ) . '<span>円(税込 ' . esc_html( $price_taxin ) . '円)</span></div>';
}
?>

詳細は公式サイトを参照してください。
https://www.lazyblocks.com/docs/blocks-controls/text/

次にクライアントが入力する際の利便性を考えて、Lazy Blocksにテンプレートを登録しておきます。新規投稿の際に、デフォルトで入力項目が表示されます。(既に作成済みの投稿には反映しません)

注意点ですが、先ほどのカスタムブロックのBlock設定で、Conditionの設定はしません。
表示するポスト(Show in posts)で、該当するカスタム投稿(ここではメニュー)を選んでしまうと、テンプレート登録の際に、このブロックが表示されなくなります。(Lazy Blocksのテンプレートは、カスタム投稿「メニュー」ではないので当たり前です・・・)これでしばらくハマりました。

このブロックは、投稿でもクエリーループ内でも表示できました。

ここまでできるのであれば、複雑な内容でなければ、ACFの対抗馬になりえると確信しました。ただ、関連記事の表示などはPro版が必要なので、そこは残念・・・!