web-dev-qa-db-ja.com

カテゴリーと製品をランダムな順序で

私がやろうとしているのは、Woocommerceのカテゴリと商品を1ページにランダムに表示することです。通常の設定では、同じページにカテゴリと商品を表示できますが、最初にカテゴリが表示され、その後商品が表示されます。これは、カテゴリに関数woocommerce_product_subcategories()が付属し、その後製品ループが開始されるためです。

私がやりたいことはこのようなものです。

    $args = array(
    'post_type' => array('product', 'post'),
    'orderby' => 'Rand', 
    'posts_per_page' =>-1,
    'post_status' => 'publish'
);

$query = new WP_Query($args);

しかし、私はそこにカテゴリを取得する方法がわかりません。

私の質問を詳述するために:私は追加することでカテゴリの出力をランダム化することができました:

shuffle( $product_categories );

関数woocommerce_product_subcategories()に、または私が作成したテンプレートにexcactするために、私は多かれ少なかれそこから関数からコードをコピーしました

誰かに役立つかもしれないと思って、それをここに見つけました: http://core.trac.wordpress.org/ticket/21875

しかし、それは単なるカテゴリーに対する解決策であるか、または上記で述べたように、カテゴリーがシャッフルされる製品の前に表示されている場合はもちろんですが、それでも製品には含まれません


さて、@ s_ha_dumの答えに触発された私は解決策を得るために管理しました:

//this 1. part is out of the woocommerce-template.php and part of the woocommerce_product_subcategories()
$product_cat = get_term_by( 'slug', $product_cat_slug, 'product_cat' );
$product_category_parent = $product_cat->term_id;

$pcat_args = array(
'child_of'  => $product_category_parent,
'hide_empty'    => 1,
'hierarchical'  => 1,
'taxonomy'      => 'product_cat',
'pad_counts'    => 1
);
$product_categories = get_categories( $pcat_args  );

//grab things by post_type product
$prod_args = array(
'post_type' => array('product'),
'orderby' => Rand, 
'posts_per_page' =>-1,
'post_status' => publish
);
$ng_query = get_posts($prod_args);

//combines, merge the arrays
$merge_query = array_merge( $ng_query, $product_categories );

//make the order random
shuffle($merge_query);

//iterate merged arrays
foreach( $merge_query as $mqp ) { 
setup_postdata($mqp);
if ( $mqp->taxonomy == product_cat ) {
echo $mqp->category_nicename;
echo "<br/>";
} else {
echo $mqp->post_title;
echo "<br/>";
}
}

これは私に無作為に分類と製品のリストを与えます!

@s_ha_dumが言ったように、一緒にマージされた配列/オブジェクトタイプの間で異なるのは必要ではないと述べました。私は、この単純化された解決策のために、分類法をチェックすることによってそれをしました - それがより複雑な出力のための良い方法であるかどうかわからない。

(1)編集:私は今、すべての特定のフォーマットとそれがまだうまく機能してそれを実装した - 分類法"product_cat"を探すことは私のシナリオのための良い解決策です!

(2番目)編集:私は価格とカートに追加ボタンが表示されず、繰り返しが壊れてしまうという問題に遭遇しました、その解決策はsetup_postdata();を追加することでした - 私は上記のコードにそれを追加しました

1
Nicolai

kaiserが示唆しているように、私の最後の解決策としての編集:

さて、@ s_ha_dumの答えに触発された私は解決策を得るために管理しました:

//this 1. part is out of the woocommerce-template.php and part of the woocommerce_product_subcategories()
$product_cat = get_term_by( 'slug', $product_cat_slug, 'product_cat' );
$product_category_parent = $product_cat->term_id;

$pcat_args = array(
'child_of'  => $product_category_parent,
'hide_empty'    => 1,
'hierarchical'  => 1,
'taxonomy'      => 'product_cat',
'pad_counts'    => 1
);
$product_categories = get_categories( $pcat_args  );

//grab things by post_type product
$prod_args = array(
'post_type' => array('product'),
'orderby' => Rand, 
'posts_per_page' =>-1,
'post_status' => publish
);
$ng_query = get_posts($prod_args);

//combines, merge the arrays
$merge_query = array_merge( $ng_query, $product_categories );

//make the order random
shuffle($merge_query);

//iterate merged arrays
foreach( $merge_query as $mqp ) { 
setup_postdata($mqp);
if ( $mqp->taxonomy == product_cat ) {
echo $mqp->category_nicename;
echo "<br/>";
} else {
echo $mqp->post_title;
echo "<br/>";
}
}

これは私に無作為に分類と製品のリストを与えます!

@s_ha_dumが言ったように、一緒にマージされた配列/オブジェクトタイプの間で異なるのは必要ではないと述べました。私は、この単純化された解決策のために、分類法をチェックすることによってそれをしました - それがより複雑な出力のための良い方法であるかどうかわからない。

(1)編集:私は今、すべての特定のフォーマットとそれがまだうまく機能してそれを実装した - 分類法"product_cat"を探すことは私のシナリオのための良い解決策です!

(2番目)編集:私は価格とカートに追加ボタンが表示されず、繰り返しが壊れてしまうという問題に遭遇しました、その解決策はsetup_postdata();を追加することでした - 私は上記のコードにそれを追加しました

2
Nicolai

カテゴリと製品の配列/オブジェクトを結合してからそれらをシャッフルし、結合した配列/オブジェクトをループ処理することができるはずです。私が期待する問題:

  1. 1つはオブジェクト、もう1つは配列なので、どちらかをキャストする必要があります。
  2. 2つの部分の形式は異なる可能性があるため、ループを繰り返すたびに、アイテムが商品かカテゴリかを確認し、それに応じて表示機能を切り替える必要があります。

そうでなければ、それはそれほど難しいことではありません。あなたが熟考していたように、クエリでそれを引っ張ることはトリッキーだと思う。

0
s_ha_dum