web-dev-qa-db-fra.com

Catégories et produits dans un ordre aléatoire

Ce que j'essaie de faire, c'est d'afficher des catégories et des produits Woocommerce au hasard sur une page. Les paramètres normaux permettent d'afficher des catégories et des produits sur la même page, mais viennent d'abord les catégories et ensuite les produits. C'est le cas, car les catégories sont fournies avec la fonction woocommerce_product_subcategories() et ensuite, la boucle du produit démarre.

Ce que je veux, c'est quelque chose comme ça:

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

$query = new WP_Query($args);

mais je ne sais pas comment obtenir les catégories ici.

pour développer ma question: j’ai pu randomiser le résultat des catégories en ajoutant:

shuffle( $product_categories );

à la fonction woocommerce_product_subcategories() ou à être identique au modèle que j'ai créé, mais j'ai plus ou moins copié le code de la fonction à cet endroit

je pensais que cela pourrait aider quelqu'un, je l'ai trouvé ici: http://core.trac.wordpress.org/ticket/21875

mais ce n'est qu'une solution pour seulement les catégories ou, comme indiqué précédemment, si les catégories sont affichées avant les produits, elles seront brassées, mais bien sûr toujours pas avec les produits.


ok, inspiré par @s_ha_dum answer, j'ai réussi à trouver une solution:

//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/>";
}
}

cela me donne une liste aléatoire de catégories et de produits!

comme @s_ha_dum a dit qu'il est nécessaire de différer entre les types de tableaux/objets fusionnés. Je l'ai fait, pour cette solution simplifiée, en vérifiant la taxonomie - je ne sais pas si c'est un bon moyen d'obtenir des sorties plus complexes.

(1er) EDIT: je l’ai maintenant implémenté avec tous les formats spécifiques et cela fonctionne toujours bien - donc chercher la taxonomie "product_cat" est une bonne solution pour mon scénario!

(2ème) EDIT: j'ai rencontré le problème que le prix et le bouton d'ajout au panier n'apparaissaient pas et que l'itération se brisait, la solution pour cela consistait à ajouter setup_postdata(); - j'ai ajouté cela dans le code ci-dessus

1
Nicolai

comme suggéré par kaiser, mon dernier montage de travail en tant que solution:

ok, inspiré par @s_ha_dum answer, j'ai réussi à trouver une solution:

//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/>";
}
}

cela me donne une liste aléatoire de catégories et de produits!

comme @s_ha_dum a dit qu'il est nécessaire de différer entre les types de tableaux/objets fusionnés. Je l'ai fait, pour cette solution simplifiée, en vérifiant la taxonomie - je ne sais pas si c'est un bon moyen d'obtenir des sorties plus complexes.

(1er) EDIT: je l’ai maintenant implémenté avec tous les formats spécifiques et cela fonctionne toujours bien - donc chercher la taxonomie "product_cat" est une bonne solution pour mon scénario!

(2ème) EDIT: j'ai rencontré le problème que le prix et le bouton d'ajout au panier n'apparaissaient pas et que l'itération se brisait, la solution pour cela consistait à ajouter setup_postdata(); - j'ai ajouté cela dans le code ci-dessus

2
Nicolai

Vous devriez pouvoir combiner les catégories et le tableau produits/produits, puis les mélanger, puis parcourir le tableau/objet combiné. Des problèmes auxquels je m'attendrais:

  1. L’un peut être un objet et l’autre un tableau, il vous faudra donc lancer l’un ou l’autre.
  2. Le format des deux parties peut être différent, vous devez donc vérifier à chaque itération si l'élément est un produit ou une catégorie et modifier la fonction d'affichage en conséquence.

Sinon, cela ne devrait pas être trop difficile. Je pense que ce serait plus délicat de le tirer avec la requête que vous envisagiez.

0
s_ha_dum