How to amend wordpress search so it queries taxonomy terms and category terms?

后端 未结 2 853
北荒
北荒 2021-02-04 22:36

I want to amend the search so if say I have taxonomy called \"author\" and add a term of \"Ian Rankin\" to a post, if I search for \"Ian Rankin\", I want that post to come up.

2条回答
  •  梦如初夏
    2021-02-04 22:53

    You can alter the search query using filter hooks to join the taxonomy tables.

    e.g. to also search on the 'author' taxonomy

    First join the taxonomy tables

    function tax_search_join( $join )
    {
      global $wpdb;
      if( is_search() )
      {
        $join .= "
            INNER JOIN
              {$wpdb->term_relationships} ON {$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id
            INNER JOIN
              {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id = {$wpdb->term_relationships}.term_taxonomy_id
            INNER JOIN
              {$wpdb->terms} ON {$wpdb->terms}.term_id = {$wpdb->term_taxonomy}.term_id
          ";
      }
      return $join;
    }
    add_filter('posts_join', 'tax_search_join');
    

    then find the search term in the taxonomy 'author'

    function tax_search_where( $where )
    {
      global $wpdb;
      if( is_search() )
      {
        // add the search term to the query
        $where .= " OR
        (
          {$wpdb->term_taxonomy}.taxonomy LIKE 'author'
          AND
          {$wpdb->terms}.name LIKE ('%".$wpdb->escape( get_query_var('s') )."%')
        ) ";
      }
      return $where;
    }
    add_filter('posts_where', 'tax_search_where');
    

    and finally group the results by post id to avoid duplicate results because of the join

    function tax_search_groupby( $groupby )
    {
      global $wpdb;
      if( is_search() )
      {
        $groupby = "{$wpdb->posts}.ID";
      }
      return $groupby;
    }
    add_filter('posts_groupby', 'tax_search_groupby');
    

提交回复
热议问题