サポート » 使い方全般 » 同一カスタムフィールド値から、別のカスタムフィールド値の一覧取得

  • 解決済 Chiaki

    (@mel_cha)


    お世話になっております。

    表示としては、下記のように表示したいと考えています。

    <h3>「イルカ(※カスタムフィールドA)」の種類</h3>
    <ul>
    <li><a href="http://○○?s=マイルカ">マイルカ(※投稿のカスタムフィールドB)</a></li>
    <li><a href="http://○○?s=ハセイルカ">ハセイルカ(※投稿のカスタムフィールドB)</a></li>
    <li><a href="http://○○?s=シナウスイロイルカ">シナウスイロイルカ(※投稿のカスタムフィールドB)</a></li>
    </ul>

    現在は下記のように、まず同一のカスタムフィールドAをもっている投稿を全て取得し、
    取得した投稿のカスタムフィールドBを配列に入れ、その配列をforeach()で表示しています。
    ※カスタムフィールドはAdvanced custom fieldsを使用しています

    $arr = array();
    $sameType = new WP_Query(array(
    	'posts_per_page' => -1,
    	'order'=> 'DESC',
    	'orderby' => 'date',
    	'category_name' => 'new',
    	"meta_query" => array( array(
    		'key' => 'type',
    		'value' => get_field('type'),
    		'compare' => '=',
    		'type' => 'CHAR'
    	))
    ));
    if ( $sameType->have_posts() && get_field('type') != 'なし' ) :
    	echo '<h3>「'.the_field('type').'」の種類</h3>';
    	while ( $sameType->have_posts() ) : $sameType->the_post();
    	$ttl = get_field('db_book_series', $sameType->ID);
    	array_push($arr, $ttl);
    	endwhile;wp_reset_postdata();
    	$arr = array_unique($arr); //重複削除
    	echo '<ul>'
    	foreach ($arr as $type) :
    		echo '<li><a href="'.get_home_url().'/?s='.$type.'">'.$type.'</a></li>';
    	endforeach;
    	echo '</ul>';
    endif;

    この方法でも取れてはいるのですが、この先投稿データが増えていくと
    重くならないかと懸念があります。。
    もっとよい方法がありましたら教えてください。

    どうぞ、よろしくお願い致します。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • モデレーター gatespace

    (@gatespace)

    斜め上の回答かも知れませんが、カスタムタクソノミー(分類)を階層あり(投稿のカテゴリーに同じ)で作った方が簡単だったんじゃない?

    トピック投稿者 Chiaki

    (@mel_cha)

    >gatespaceさん

    回答ありがとうございます。

    そうですよね・・・。
    すみません、補足が抜けておりました。

    カスタムフィールドA、カスタムフィールドB共に、入力欄となっています。
    確かに、カスタムタクソノミーでやろうと思えば出来ますが、
    投稿は全てCSVで一括管理するため、できれば毎回入力出来た方がいいだろう・・・という背景があります。

    CSV読み込みはCSVImporterを使用していますが、タクソノミーの階層構造はうまく読み込めないようなのです。

    また、カスタムフィールドBは、下記を参考に検索対象に含めています。
    WordPressでカスタムフィールドも検索対象にする
    ただ、これもタクソノミーURLを取得すればいい話ではありますが・・・。

    後出しですみません。。

    トピック投稿者 Chiaki

    (@mel_cha)

    すみません。

    カスタムフィールドAの方は、別の箇所でも表示に使っているのでできればこのままカスタムフィールドで使いたいです。

    ページの全体像としては・・・

    <h1>ページタイトル<h1>
    <p>カスタムフィールドA</p>
    <div>本文</div>
    
    <h3>カスタムフィールドBの関連記事</h3>
    <ul>~</ul>
    
    <h3>カスタムフィールドAの関連項目</h3>
    <ul>~</ul>

    この

    <h3>カスタムフィールドAの関連項目</h3>
    <ul>~</ul>

    部分で、カスタムフィールドBの一覧を出したいです。
    (本来は記事一覧をずらっと出していたのですが、カスタムフィールドBの一覧を出すことになりました。。)

    2つのカスタムフィールドを Join Join して、DISTINCT も同時に行うような SQL を発行すれば(WordPress の関数は使わない)、クエリー数が減るのではないでしょうか?

    トピック投稿者 Chiaki

    (@mel_cha)

    >pluto1234さん

    ヒントありがとうございます!!
    列の SELECTや、色々なSQL解説サイトで調べながらSQL文に挑戦していたのですが、かなり行き詰っています。。

    根本的に書き直したりして、現在下記のコードで止まっています。

    $field1 = get_field('custom1');
    $field2 = get_field('custom2');
    
    $results = $wpdb->get_results( $wpdb->prepare(
    	"SELECT DISTINCT *
    	FROM $wpdb->posts AS P
    	LEFT JOIN $wpdb->postmeta AS F1
    		ON P.ID = F1.post_id
    		AND F1.meta_key = 'custom1'
    	LEFT JOIN $wpdb->postmeta AS F2
    		ON F1.post_id = F2.post_id
    		AND F2.meta_key = 'custom2'
    	WHERE post_type = 'post'
    	AND post_status = 'publish'
    ", $field1) );
    
    var_dump($results);

    お手数ですが、もう少しヒントを頂けないでしょうか。。

    どうぞ、よろしくお願い致します。

    トピック投稿者 Chiaki

    (@mel_cha)

    あまり自信はないのですが・・・出来たかもしれません!

    $wpdb->flush();
    $field1 = get_field('custom1');
    
    $results = $wpdb->get_results( $wpdb->prepare(
    	"SELECT DISTINCT F2.meta_value
    	FROM $wpdb->posts AS P
    	LEFT JOIN $wpdb->postmeta AS F1
    		ON P.ID=F1.post_id
    		AND F1.meta_key = 'custom1'
    	LEFT JOIN $wpdb->postmeta AS F2
    		ON P.ID=F2.post_id
    		AND F2.meta_key = 'custom2'
    	WHERE F1.meta_value = '%s'
    	AND post_type = 'post'
    	AND post_status = 'publish'
    ", $field1) );
    
    echo '<ul class="inblock-list">';
    foreach($results as $value) {
    	echo '<li>・<a href="'.get_home_url().'/?s='.$value->meta_value.'">'.$value->meta_value.'</a></li>';
    };
    echo '</ul>';

    少し疑問なのですが、「$wpdb->flush();」は入れておいたほうがいいのでしょうか?
    色々試している間、なぜか項目の反映が遅れることがあり、これを入れると解消されました。
    入れておくことで何か不都合が生じる可能性があるでしょうか?

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「同一カスタムフィールド値から、別のカスタムフィールド値の一覧取得」には新たに返信することはできません。