web-dev-qa-db-ja.com

分類法アーカイブ:個別のカスタム分類法から1用語につき1つの投稿のみを表示する

カスタム投稿タイプと4つのカスタム分類法を使用して構築している製品カタログのためのソリューションを思いつくことができません。製品カタログは「モデル」で区切られていますが、各「モデル」には最大15の「製品」バリエーションを含めることができます。各「製品」には異なる属性があり、これらの属性に基づいて製品のリストをフィルタリングできるようにする必要があります。

構造的には、次のように構成されたものがあります。

  • 商品(カスタムポストタイプ)
  • モデル(分類学)
  • サイズ(分類)
  • 色(分類)
  • 機能(分類)

「モデル」を除いて、各分類法は表示されている製品をフィルタリングする方法として使用されます。各製品の属性をフィルタするために、Query Multiple Taxonomiesプラグインを使用しています。これはとてもうまくいきます。それは私がデフォルトのWordpressテンプレート階層を使い、taxonomy.phpファイルに私のすべての変更を加えることを可能にします。

今ここに私が迷子になるところです。フィルタリングによってモデルごとに複数の製品が返される場合でも、表示される結果を制限して各モデルの1つのみが表示されるようにします。

私は現在、The Loopとget_the_terms()を使って配列を作成し、次にarray_unique()関数を使って各モデル名のインスタンスを1つだけ配列に保存しています。これは私がその部分のために持っているコードです:

$modelSlugs = array();

while (have_posts()) : the_post();

// Gather the model names assigned to each product
$terms = get_the_terms( $post->ID, 'models' );
if ( $terms && ! is_wp_error( $terms ) ) : 
    $term = array_pop($terms);
    $modelSlugs[] = $term->slug;
endif;                               

endwhile;    

$modelList = array_unique($modelSlugs);

これはそれぞれのモデルスラッグ(または名前)から1つのみを提供しますが、これは良いことですが、製品のサムネイルを表示し、単一の製品ページにリンクするためにパーマリンクを使用する必要もあります。各スラッグに基づいて追加のクエリを生成できることはわかっていますが、それはパフォーマンスの悪夢のように思えます。

もっと考えてみると、これが間違ったやり方であると考えるのは仕方がありません。返された$ wp_queryオブジェクトに必要なものがすべて揃っていることを知っています。モデルごとに1つの投稿のみを表示するためにどのようなトリックを使用すればよいかわからないのです。ループを実行する前に、返されたWP_Queryオブジェクトを準備または操作する方法はありますか。それとも、表示される商品の数を制限するためにループ内でできることはありますか?

1
Michael Hendry

キーボードをたくさん叩いた後、私はそれを考え出しました。これを実行するのが最善の方法ではないかもしれませんが、それはうまくいき、追加のDBクエリを必要としません。

上記のコードを使用して、表示する必要があるモデルのリストを生成しました。

私はそれからすべてが起こるようにするためにこのコードを使いました。

foreach ($modelList as $model) :

$count = 0;
echo '<h2>' . $model . '</h2>';

// Run the loop again to show the products
while (have_posts()) : the_post();

    // Check that the model name for the post is the same as the model 
    if ( has_term( $model, 'models') ) :

        // Show only first item in loop
        if ($count == 0) :

            get_template_part( 'content', 'model' );                                                            

        endif;

        $count++;

    endif; //has_term                   

endwhile;

endforeach;

ここで少し説明しましょう。

モデルリスト用にforeachループを作成し、その中ですべての投稿を表示するための標準ループを実行しました。投稿がモデル名で確実にグループ化されるようにするために、has_term()を使用して投稿のモデル名が配列内のアイテムと一致するようにしました。その後、whileループにカウンタを追加して、最初の投稿のみが表示されるようにしました。

2
Michael Hendry