Search Terms – Querying on either description__like OR name__like in the same Term Query?

In my theme’s search.php I have a section set up to show terms that fit the search. I want the term to show up IF the $keyword appears in the term’s title or its description. I have it set up to do just that but if feels clunky to me to have to do two separate queries then prune the results to make sure each term is only displayed once.

  $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

Is there a more efficient way to query based on both? Thank you!

2 Answers
2

I don’t see any options for WordPress to search terms by both of name & description. So i combined 2 queries like @StephanieQ but maybe more simple way, checkout my ajax response below:

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();
}

Leave a Comment