在我的主题中search.php
我设置了一个部分来显示适合搜索的术语。如果$keyword
出现在术语的标题或描述中。我已经设置好这样做了,但是如果我觉得必须进行两个单独的查询很笨拙,那么就删减结果,确保每个术语只显示一次。
$search_matters_args = array(
\'taxonomy\' => array(\'book\', \'magazine\'), // taxonomies to search
\'orderby\' => \'id\',
\'order\' => \'ASC\',
\'hide_empty\' => false,
\'fields\' => \'all\',
\'number\' => 8,
\'name__like\' => $keyword,
);
$name_search = new WP_Term_Query($search_matters_args);
/*--- Query again on description ---*/
$search_matters_args[\'name__like\'] = \'\'; // Override for next query
$search_matters_args[\'description__like\'] = $keyword; // Override for next query
$desc_search = new WP_Term_Query($search_matters_args);
$books_and_magazines = array_merge($name_search->terms, $desc_search->terms);
$filtered_topics = array();
if (!empty($books_and_magazines) && !is_wp_error($books_and_magazines)) {
$unique_ids = array();
for ($i=0; $i < count($books_and_magazines); $i++) {
$termID = $books_and_magazines[$i]->term_id;
if (in_array($termID, $unique_ids)) {
continue;
} else {
$unique_ids[] = $termID;
$filtered_topics[] = $books_and_magazines[$i];
}
} // End For loop
$books_and_magazines = $filtered_topics;
} // End if $books_and_magazines is not empty or WP Error
有没有一种更有效的方法可以基于这两者进行查询?非常感谢。
SO网友:harisrozak
我看不到WordPress可以通过名称和;描述因此,我组合了两个查询,如@StephanieQ,但可能更简单的方法是,在下面查看我的ajax响应:
public function ajax_project_terms_search() {
$results = array();
$search_query = sanitize_text_field($_GET[\'q\']);
$withname = intval($_GET[\'withname\']);
$search_keys = array(\'name__like\', \'description__like\');
$exclude = array();
foreach ($search_keys as $search_key) {
$terms = get_terms( array(
\'taxonomy\' => \'project\',
\'hide_empty\' => false,
\'number\' => 8,
\'exclude\' => $exclude,
$search_key => $search_query,
));
// create results
foreach ($terms as $term) {
$exclude[] = $term->term_id;
$results[] = array(
\'id\' => isset($_GET[\'return_id\']) ? $term->term_id : $term->slug,
\'text\' => $withname ? $term->name . \' - \' . $term->description : $term->name,
);
}
}
wp_send_json($results);
wp_die();
}