Products
GG网络技术分享 2025-03-18 16:12 6
I have the below code, it works initially with regards to the fact that it displays the products for all taxonomies. However if a product is set to 2 taxonomies then it will display twice on the page as opposed to showing the first instance of the product.
<?php if ( $terms && !is_wp_error( $terms ) ) {foreach ( $terms as $term ) {
$args = array(
\'post_type\' => \'products\',
\'posts_per_page\' => -1,
\'orderby\' => \'menu_order\',
\'tax_query\' => array(
array(
\'taxonomy\' => \'product_cat\',
\'field\' => \'slug\',
\'terms\' => $term->slug,
),
),
\'order\' => \'asc\',
);
runQuery($args);
}
} ?>
Here is the runQuery function:
<?php $x = 0;function runQuery($args) {
global $x;
$query = new WP_Query( $args );
if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post();
$cat_terms = get_the_terms($post->id, \'product_cat\');
$datagroups = \'\';
foreach ($cat_terms as $key => $cat) {
if (count($cat_terms) == ($key + 1)) {
$datagroups .= \'\"\' . $cat->name . \'\"\';
} else {
$datagroups .= \'\"\' . $cat->name . \'\", \';
}
}
?>
HTML Here that is displayed;
<?php $x ++;
endwhile;
endif;
wp_reset_postdata();
}?>
I have figured this out, I essentially just had to check the current post in the loop to see if it had already been displayed:
<?php $x = 0;$displayed = [];
function runQuery($args) {
global $displayed;
global $x;
$query = new WP_Query( $args );
if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post();
$cat_terms = get_the_terms($post->id, \'product_cat\');
$datagroups = \'\';
if ( in_array( get_the_ID(), $displayed ) ){
continue;
}
// update array with currently displayed post ID
$displayed[] = get_the_ID();
foreach ($cat_terms as $key => $cat) {
if (count($cat_terms) == ($key + 1)) {
$datagroups .= \'\\\"\' . $cat->name . \'\\\"\';
} else {
$datagroups .= \'\\\"\' . $cat->name . \'\\\", \';
}
}
?>
Source that may help others: https://wordpress.stackexchange.com/questions/285091/avoid-duplicate-post-from-same-taxonomy
Demand feedback