I need some help writing a shortcode to display all product tags associated with a specific product category which can be displayed on any page.
My problem is that I can display all product tags anywhere by using the below code, but I'm unable to filter those tags by a given product category:
function product_terms_by_cat() {
$terms = get_terms (
array (
'taxonomy' => 'product_tag',
'hide_empty' => false)
);
foreach ( $terms as $term ) {
echo $term->name;
}
}
add_shortcode('product_terms_by_cat', 'product_terms_by_cat');
I've tried using functions for standard WP post tags/categories but they're used within the loop (eg. category pages or single post pages) and don't help.
Could modifying the code found on this link work?The code filters categories based on tags (the opposite of what I want). Cheers
I need some help writing a shortcode to display all product tags associated with a specific product category which can be displayed on any page.
My problem is that I can display all product tags anywhere by using the below code, but I'm unable to filter those tags by a given product category:
function product_terms_by_cat() {
$terms = get_terms (
array (
'taxonomy' => 'product_tag',
'hide_empty' => false)
);
foreach ( $terms as $term ) {
echo $term->name;
}
}
add_shortcode('product_terms_by_cat', 'product_terms_by_cat');
I've tried using functions for standard WP post tags/categories but they're used within the loop (eg. category pages or single post pages) and don't help.
Could modifying the code found on this link work?The code filters categories based on tags (the opposite of what I want). Cheers
Share Improve this question asked Aug 19, 2019 at 0:47 JVANJVAN 232 silver badges5 bronze badges 02 Answers
Reset to default 1Ahh ha! Have figured out how to do this. Here's the code for future people who are looking for the same thing:
function get_category_tags($args) {
global $wpdb;
$tags = $wpdb->get_results("
SELECT DISTINCT terms2.term_id as tag_id, terms2.name as tag_name, terms2.slug as tag_slug, null as tag_link
FROM
wp_posts as p1
LEFT JOIN wp_term_relationships as r1 ON p1.ID = r1.object_ID
LEFT JOIN wp_term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
LEFT JOIN wp_terms as terms1 ON t1.term_id = terms1.term_id,
wp_posts as p2
LEFT JOIN wp_term_relationships as r2 ON p2.ID = r2.object_ID
LEFT JOIN wp_term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
LEFT JOIN wp_terms as terms2 ON t2.term_id = terms2.term_id
WHERE
t1.taxonomy = 'product_cat' AND p1.post_status = 'publish' AND terms1.term_id IN (".$args['categories'].") AND
t2.taxonomy = 'product_tag' AND p2.post_status = 'publish'
AND p1.ID = p2.ID
ORDER by tag_name
");
$count = 0;
foreach ($tags as $tag) {
$tags[$count]->tag_link = get_tag_link($tag->tag_id);
$count++;
}
return $tags;
}
$args = array('categories'=> "YOUR PRODUCT CATEGORY ID HERE");
$tags = get_category_tags($args);
foreach ($tags as $tag) {
echo '<a href="'.$tag->tag_link.'">' . $tag->tag_name . '</a>';
}
I used this in a WP Bakery shortcode and it worked a treat. I guess you could use this wherever you would like. Enjoy!
function product_terms_by_cat() {
$terms = get_terms (
array (
'taxonomy' => 'product_category',
'hide_empty' => false)
);
foreach ( $terms as $term ) {
echo $term->name;
}
}
add_shortcode('product_terms_by_cat', 'product_terms_by_cat');