Get WooCommerce Product Tags for Array of Products
Is it possible to get a list of WooCommerce product tags, but only if they are associated with an array of specific products?
I have an array of product IDs, but I can't figure out where to start - I've looked at a lot of get_tag functions in the Wordpress Codex documentation, but they all seem to be for individual post / page / custom post types, not for use in the array.
source to share
With the help of WisdmLabs, I was able to put together the code that gets the product tags found for all products of a specific WooCommerce brand.
I also added a bit of functionality like removing duplicate tag values ββand adding the total along with each tag with the number of products that have that tag, so the output looks like ...
β’ Product Tag 1 (12) β’ Product Tag 3 (4) β’ Product Tag 4 (7) β’ Product Tag 8 (11)
The code below is for those who would like to use it or adapt it. I am outputting the results below the brand description using the WooCommerce brand hook woocommerce_archive_description
.
function get_wc_product_brand_related_tags() {
global $post;
// Access the objects in the current WooCommerce query loop
$queried_object = get_queried_object();
// Get the term_id and term_name values
$term_id = $queried_object->term_id;
$term_name = $queried_object->slug;
// FOR TESTING ONLY - Echo the term_id and term_name values to see if they are what we're expecting
//echo '<p>The <em>term_id</em> is <strong>' . $term_id . '</strong> and the <em>term_name</em> is <strong>' . $term_name . '</strong>.</p>';
// Create our products array for use later
$products_array = array();
// Query the posts using the product custom post type and product_brand custom taxonomy terms
$brand_post_args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'product_brand' => $term_name
);
// Run our WP_Query with the args above
$brand_post_query = new WP_Query($brand_post_args);
// If any products (posts using the product custom post type) are foundβ¦
if( $brand_post_query->have_posts() ) {
while ($brand_post_query->have_posts()) : $brand_post_query->the_post();
// FOR TESTING ONLY - shows a lot more information including product id, name and tags
$products_array[] = get_the_id() . ' - ' . get_the_title() . ' - ' . get_the_term_list($brand_post_query->ID, 'product_tag');
// Populate the array with the tags found for the product
$products_tags_array[] = get_the_term_list($brand_post_query->ID, 'product_tag');
endwhile;
}
// Count the duplicate values found inside our array
$count_tag_totals = array_count_values($products_tags_array);
// FOR TESTING ONLY - Used below to show the product information such as id, name etc
$show_product_values = array_unique($products_tags_array);
// Show the tags found for all of the products for the current brand, along with the number found for each tag
echo '<ul>';
foreach($count_tag_totals as $key=>$value) {
echo '<li>' . $key . ' ('. $value . ')</li>';
}
echo '</ul>';
// FOR TESTING ONLY - Displays unique tag name(s) along with a total of the products that have that tag
//echo '<pre><h3>Unique product tag(s) and associated totals for this brand… </h3>',print_r($count_tag_totals,1),'</pre>';
// FOR TESTING ONLY - Displays a list of all products (id and name) along with their tags
//echo '<pre><h3>The products details for this brand page are… </h3>',print_r($products_array,1),'</pre>';
// Reset the WP_Query for use elsewhere
wp_reset_query();
}
add_action('woocommerce_archive_description', 'get_wc_product_brand_related_tags', 15);
source to share
Why not iterate over the array to get all the tags for the product list.
Here's the code you can use:
function wdm_get_tags($products_array){
echo "Tags: ";
foreach($products_array as $single_product)
{
echo get_the_term_list($single_product, 'product_tag', '', ',' );
echo ',';
}
}
Here is the code by which you can test the function:
$products=array(378,356);
wdm_get_tags($products);
Here is the output for the demo setup I tried:
This code works fine. Let me know if this resolved the problem for you.
source to share