サポート » プラグイン » 【修正】カスタムフィールドで作成した各情報の紐付け

  • 利用環境
    WordPress 4.9.10
    Custom Post Type UI バージョン 1.6.0
    Advanced Custom Fields PRO バージョン 5.7.7

    以前作成したトピックスの内容が複雑になってしまったので、少しスリムにして再アップさせて頂きました。
    https://ja.wordpress.org/support/topic/%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%83%95%e3%82%a3%e3%83%bc%e3%83%ab%e3%83%89%e3%81%a7%e4%bd%9c%e6%88%90%e3%81%97%e3%81%9f%e5%90%84%e6%83%85%e5%a0%b1%e3%81%ae%e7%b4%90%e4%bb%98%e3%81%91/

    商品紹介及び取扱店舗の紹介サイトを制作中で、『Custom Post Type UI』と『Advanced Custom Fields』を利用しています。

    商品詳細ページと店舗詳細ページの紐付け方法がわからず止まっています。
    やりたい事としては、商品Aの詳細ページを開くと商品画像や発売元などの詳細情報の他にリンク付の取扱店舗名欄を表示し、仮に取扱店舗Aのリンクをクリックすると取扱店舗Aの店舗画像や住所などの詳細情報とその店舗Aに紐付けされた商品、取扱店舗A以外のB,Cを画像つきリンクとして一覧表示したいと思っています。
    商品詳細情報の取扱店舗リンク以外はうまく表示できています。

    作成投稿タイプ
    ■product(各個別商品情報)
    タクソノミー:productcat(商品カテゴリ)
    登録カテゴリ:食肉カテゴリ(スラッグ:meat)
    テンプレート:single-product.php

    ■stores(各取扱い店舗情報)
    タクソノミー:industrytypes(業種カテゴリ)
    登録カテゴリ:スーパーマーケットカテゴリ(スラッグ:supermarket)
    テンプレート:single-stores.php

    テンプレート
    ・single-product.php

    
    <?php if ( has_term( 'meat', 'productcat') ) { ?>
    	<div class="product-single-data-dl">
    		<dl>
    			<dt>発売元</dt>
    			<dd><?php echo get_the_term_list( $post->ID, 'productmanufacturer', '', ',', ''); ?></dd>
    		</dl>
    		<dl>
    			<dt>【取扱店舗】</dt>
    			<dd><?php echo get_the_term_list( $post->ID, '###', '', ',', '');  ?></dd>
    		</dl>
    		<dl>
    			<dt>分類</dt>
    			<dd><?php echo get_the_term_list( $post->ID, 'productgroup', '', ',', ''); ?></dd>
    		</dl>
    	</div>
    
    <?php } ?>
    

    発売元、分類は投稿タイプ「product」からの情報ですが、
    【取扱店舗】は投稿タイプ「stores」で登録した情報をリンク付で表示させ、表示された【店舗A○○店】をクリックすると『single-product.php』で内容を表示させたいと思っているのですが投稿タイプを跨いで表示させることは可能なのでしょうか?

    解決策をご存知の方がいらっしゃいましたら何卒ご教授頂きますようお願い致します。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • @stellanova99 さん

    情報を見る限り、相互で共通するオブジェクト(タクソノミーやカスタムフィールドなど)が無いと思われるので
    カスタムフィールドで、タクソノミータームを選択するか、
    個別に記事を選択すれば可能では無いでしょうか。

    認識間違ってたらすみません。

    自分はアドバンスドカスタムフィールドの「関連」もしくは「タクソノミーターム」で似たような機能を実装させています。

    戻り値にIDを指定すると良いと思います。

    ちなみにACFはどこの部分で利用されてますでしょうか?

    実装方法は何通りかあると思いますが

    商品側に値を持たせて
    店舗側でQueryソートするか

    店舗側で単純に直接指定するか

    など、運用UIがもう少しわかれば、具体的な方法などが出せるかと思います。

    • この返信は4年、 7ヶ月前にphotographer hiro.が編集しました。理由: 追加
    トピック投稿者 stellanova99

    (@stellanova99)

    photographer hiro.様

    ご返信誠にありがとうございます。
    現在photographer hiro.様から提案頂いた件について調べながら解釈中です。

    訂正点がありまして、
    表示された【店舗A○○店】をクリックすると『single-product.php』ではなく、
    表示された【店舗A○○店】をクリックすると『single-stores.php』でした。

    整理が付きましたらまたコメントさせて頂きますので、お時間がありましたら引き続き宜しくお願い致します。

    トピック投稿者 stellanova99

    (@stellanova99)

    返信に編集を加えると【この投稿は自動化システムにより承認待ちとなっています。モデレーターが手動でレビューします。】というコメントが出て返答が表示できていないようなので新たに返信させて頂きます。

    photographer hiro.様

    >運用UIがもう少しわかれば、

    運用UIと呼べるものなのか自信はありませんが、

    商品名:ハム
    カテゴリ名:食肉(スラッグ:meat)
    タクソノミー:productcat
    投稿タイプ:product
    テンプレート:single-product.php
    内容:
    発売元=タクソノミー:productmanufacturer、投稿タイプ:product
    分類=タクソノミー:productgroup、投稿タイプ:product
    ★取扱店舗=タクソノミー:industrytypes、投稿タイプ:stores
    原材料=カスタムフィールド(フィールド名:商品データ)で作成
    注意事項=カスタムフィールド(フィールド名:商品データ)で作成

    single-product.php

    
    <?php if ( has_term( 'meat', 'productcat') ) { ?>
    	<div class="product-single-data-dl">
    		<dl>
    			<dt>発売元</dt>
    			<dd><?php echo get_the_term_list( $post->ID, 'productmanufacturer', '', ',', ''); ?></dd>
    		</dl>
    		<dl>
    			<dt>★【取扱店舗】</dt>
    			<dd><?php echo get_the_term_list( $post->ID, '###', '', ',', '');  ?></dd>
    		</dl>
    		<dl>
    			<dt>分類</dt>
    			<dd><?php echo get_the_term_list( $post->ID, 'productgroup', '', ',', ''); ?></dd>
    		</dl>
    	</div>
    
    <?php } ?>
    

    ★取扱店舗:店舗A○○店
    親カテゴリ名:スーパーマーケット(スラッグ:supermarket)
    子カテゴリ名:店舗A(スラッグ:○○)
    タクソノミー:industrytypes
    投稿タイプ:stores
    テンプレート:single-stores.php
    内容:
    店舗名=タクソノミー:productmanufacturer、投稿タイプ:product
    住所=タクソノミー:productgroup、投稿タイプ:product
    電話番号=タクソノミー:industrytypes、投稿タイプ:stores
    営業時間=カスタムフィールド(フィールド名:店舗情報)で作成
    駐車場=カスタムフィールド(フィールド名:店舗情報)で作成
    店休日=カスタムフィールド(フィールド名:店舗情報)で作成

    single-stores.php

    
    <?php if ( has_term('supermarket', 'industrytypes') ) { ?>
    	<div class="product-single-data-dl">
    		<dl>
    			<dt>店舗名</dt>
    			<dd><?php the_field('store-data01'); ?></dd>
    		</dl>
    		<dl>
    			<dt>住所</dt>
    			<dd><?php the_field('store-data02'); ?></dd>
    		</dl>
    		<dl>
    			<dt>電話番号</dt>
    			<dd><?php the_field('store-data03'); ?></dd>
    		</dl>
    		<dl>
    			<dt>営業時間</dt>
    			<dd><?php the_field('store-data04'); ?></dd>
    		</dl>
    		<dl>
    			<dt>駐車場</dt>
    			<dd><?php the_field('store-data05'); ?></dd>
    		</dl>
    		<dl>
    			<dt>店休日</dt>
    			<dd><?php the_field('store-data06'); ?></dd>
    		</dl>
    	</div><!-- .product-single-data-dl -->
    
    <?php } ?>
    

    『投稿タイプ:product』内にて個別商品を登録する際(今回はハム)に商品情報入力ページの中に、『投稿タイプ:stores』内にて作成した取扱店舗のカテゴリ階層の選択ができるように(店舗Aの○○店なのか、店舗B■■店なのか)したいと思っています。

    商品登録後(今回はハム)single-product.phpで出力された★の部分に表示された取扱店舗(店舗Aの○○店などのリンク付店舗名)をクリックすると、『投稿タイプ:stores』内にて作成された取扱店舗情報をsingle-stores.phpで出力したいと思っております。

    トンチンカンな返答でしたら申し訳ありません。
    何卒宜しくお願い致します。

    @stellanova99 さま

    遅くなってしまって、すみません。
    何回かに分けて返信いたします。

    基本的には、商品「ハム」に取り扱い店舗のこ分類を選択出来るようにしたい!
    →その結果ハムの店舗リストにリンクをつけたい

    つまり、ハムを持っている○○店全て表示

    ここでの考え方は、「に実店舗で商品を仕入れた」=トリガーと考えるのがUI的かなと思いますので
    ○○店は
    在庫:ハム
    所属:店舗A
           となります。
    ですので、〇〇店でハムを選択出来るようにするのが良いと思います。

    そうなるとCMS上のUIとしては〇〇店に商品を選択するUIが必要で、かつ複数選択かなと思います。
    カスタム投稿タイプ「stores」にACFの関連を設置します。
    関連を複数の投稿を選択できますので「ハム」と「ベーコン」と・・・・みたいな感じで仕入れをするアクションになります。

    これで店舗Aは(仮)カスタムフィールド:在庫にハムが入っています。
    →カスタムフィールド内にハムの「$post->ID」が格納されました※戻り値をIDに設定してください

    では、商品側で考えてみます。
    現在、ハムは〇〇店によってフィールド在庫の中に格納されています。

    つまり、カスタムフィールド「在庫」を現在の投稿IDでクエリーソートを掛ければ
    「ハムを持っているお店一覧を配列で取得」をすることが可能になります。

    テストはしていませんが

    
    $post_id = $post->ID;
    $args = array(
    	'post_type' => 'stores',
    	'meta_query' => array(
    		array(
    			'key' => 'zaiko',//カスタムフィールド在庫
    			'value' => $post_id,//もしかしたらarray($post_id)かも
    			'compare' => 'LIKE'
    		)
    	)
     );
    $query = new WP_Query( $args );
    
    // The Loop
    if ( $the_query->have_posts() ) {
    	echo '<ul>';
    	while ( $the_query->have_posts() ) {
    		$the_query->the_post();
    
    		$shop_name = esc_html(get_field('store-data01'));
                    $shop_url = get_permalink( $post->ID );
    
    	}
    	echo '</ul>';
    	/* Restore original Post Data */
    	wp_reset_postdata();
    } else {
    	// no posts found
    }
    
    

    参考
    関数リファレンス WPQuery

    みたいな取得方法で取れないですかね?
    あとはループ内でsingle.phpと同じ方法で取得すれば、大体は取ってこれると思います。

    軽く調べただけなので、間違っていたらすみません。

    • この返信は4年、 7ヶ月前にphotographer hiro.が編集しました。理由: コード修正
    • この返信は4年、 7ヶ月前にphotographer hiro.が編集しました。理由: 参考追加
    トピック投稿者 stellanova99

    (@stellanova99)

    photographer hiro. 様

    返信が遅くなり申し訳ありませんでした。
    そして詳細な内容本当にありがとうございます。
    恥ずかしながらコードの部分をまだ読み解く事ができておりませんが、まずはACFの『関連』から探ってみようと思います。

    親身に対応して下さり、本当にありがとうございました。
    また進捗がありましたらコメントさせて頂きますのでその際は宜しくお願い致します。

    商品の方限定なら、ACFのリピートフィールド機能を使えばいいのかも。

    トピック投稿者 stellanova99

    (@stellanova99)

    oisit様

    提案頂きありがとうございます。
    早速調べて取り掛かってみます。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「【修正】カスタムフィールドで作成した各情報の紐付け」には新たに返信することはできません。