我目前正在使用媒体类别库,这是一个 WordPress 插件,它允许用户向其媒体添加类别,然后使用前端搜索表单根据这些类别搜索其媒体。
https://wordpress.org/plugins/media-category-library/
经过测试,我意识到,如果您在它生成的 list 上单击多个类别,它将找到这些类别中的所有媒体,而不是已分配给这些多个类别的媒体。
举这个例子。
- 媒体 1 类别=“猫”
- 媒体 2 类别=“狗”
- 媒体 3 类别=“狗、猫”
如果我勾选了猫和狗,我只想让它找到媒体 3,而忽略其他两个。但目前,如果我在复选框列表中勾选猫和狗,它将返回所有 3 个媒体。
这两个 SQL 查询似乎是问题所在,但在尝试了许多不同的方法后,我找不到问题的解决方案。
// create sub query, get term_taxonomy
$sub_sql = "SELECT x.term_taxonomy_id FROM " . $wpdb->term_taxonomy . " AS x " .
"INNER JOIN " . $wpdb->terms . " AS t ON x.term_id = t.term_id WHERE " .
"t.slug IN(" . implode( ",", $selected_terms ) . ")";
// main query that uses subquery
$sql = "SELECT SQL_CALC_FOUND_ROWS DISTINCT p.ID, p.post_title, p.post_mime_type, p.post_excerpt, p.post_date FROM " . $wpdb->posts . " AS p " . "LEFT JOIN " . $wpdb->term_relationships . " AS r ON p.ID = r.object_id " .
"WHERE r.term_taxonomy_id IN($sub_sql) AND p.post_type='attachment'";
任何帮助将不胜感激:)
最佳答案
您似乎想将第一个查询更改为 equals。
$sub_sql = "SELECT x.term_taxonomy_id FROM " . $wpdb->term_taxonomy . " AS x " .
"INNER JOIN " . $wpdb->terms . " AS t ON x.term_id = t.term_id WHERE " .
"t.slug like '" . implode(",", $selected_terms) . "%'";
内爆中的“,”后面有一个空格,因为您的示例有一个空格,如果不需要,只需将其删除即可。
更新了代码。如果您确保这些术语按特定顺序排列,您可以使用 like。排除单例并拉出所有倍数。
关于php - 在 WordPress 中根据多个类别指定搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27318732/