I only want to show posts which do not have the term ‘brand-slug’ for the taxonomy ‘product-brand’.
My current query doesn’t apply the filter:
SELECT DISTINCT * FROM $wpdb->posts AS p
LEFT JOIN $wpdb->postmeta AS meta ON p.ID = meta.post_id
LEFT JOIN $wpdb->term_relationships AS rel ON rel.object_id = p.ID
LEFT JOIN $wpdb->term_taxonomy AS tax ON tax.term_taxonomy_id = rel.term_taxonomy_id
LEFT JOIN $wpdb->terms AS term ON tax.term_id = term.term_id
WHERE 1=1
AND p.post_type = 'product'
AND p.post_status = 'publish'
AND p.post_title LIKE '%$trimmed%' OR (meta.meta_key = 'product_model' AND meta.meta_value LIKE '%$trimmed%')
AND (tax.taxonomy = 'product-brand' AND term.slug NOT IN ('$protected'))
Neither taxonomy or slug conditionals seem to be working in the above query.
Any help is appreciated!
Notes:
It looks like you’re not using
$wpdb->prepare()
, so you risk SQL injections.I also think you’re missing parentheses around the relevant OR parts, so you don’t end up displaying drafts, for example.
Alternative:
Instead of writing an hardcoded SQL query, we should be able to use the
WP_Query
class, with some modifications through hooks/filters.Here’s an example (PHP 5.4+):
where the custom
_meta_or_like_title
argument is supported by a slightly modified plugin I wrote for another question here.Plugin: