1

I have taxonomy color which is associated with a custom post type. I am listing all the post meta and the taxonomy in a table. I have a option in the table to search the posts matching the search value.

when search key is entered it will do a ajax call to get the the posts.

this is the query to get all the posts matching the search string.

function get_query_posts_custom($post_id,$start,$length)  {
    //get_posts arguments
    $args =  array(
        'post_type'     => 'custom_post',
        'post_status'   => array('publish'),
        'numberposts'   => $length,
        'offset'        => $start,
        'orderby'       => 'menu_order',
        'order'         => 'asc',
        'post_parent'   => $_product->id
    );


    //get custom post taxonomy
    $taxonomies = (array) maybe_unserialize(get_post_meta( $post_id, 'post_taxonomy', true));
    if(empty($attributes)) {
        $taxonomies = array();
    }

    $meta_keys  = array('type','code','key');       
    if(!empty($search)) {
        foreach($meta_keys as $meta_key) {
            $meta_query[] = array(
                        'key'   => $meta_key,
                        'value' => $search,
                        'compare'   => 'LIKE';
                    );

        }

        $args['meta_query'] = $meta_query;
        $tax_query = array();

        foreach($taxonomies as $taxonomy) {
            $tax_query  = array(
                'taxonomy'  =>  $taxonomy;
                'field' =>  'slug';
                'terms' =>  $search;
                'operator'  => 'LIKE';
            );
        }
        if(count($tax_query)) {
            $args['tax_query'] = $tax_query;
        }
    }
    $results    = get_posts($args);
            return $results;
}

How to get the posts that matches the search string of a taxonomy?

I searched the wordpress function reference it says only operator allowed to tax_query are 'IN,NOT IN, OR and AND') can I use the LIKE operator?

  • Have you tried the solution in this thread: wordpress.stackexchange.com/questions/123298/…? – 1fixdotio Feb 7 '14 at 7:50
  • I tried to get the term ID matching the search using the get_terms function with name_like arugment and generate the tax_query with IN operator. – B L Praveen Feb 7 '14 at 10:07
  • Does the get_posts support the operator argument in the tax_query. Function Reference does not mention anything about the tax_query with operator. Only in WP_Query it is explained. – B L Praveen Feb 7 '14 at 10:11
4

The only option you have is to write your own SQL into the posts_clauses filter, where you get an array of the JOIN, WHERE, ORDER, etc. clauses that you can alter, add to, remove, etc.

One MAJOR MAJOR note on this, is ALWAYS use the global $wpdb's prepare function, which will sanitize all your lovely datas. You don't want to be allowing any type of injection through your search term custom queries. :)

  • 1
    :) Added a note for keeping your database safe as well. – Eric Holmes Feb 7 '14 at 16:12
2

As stated in other answers you cannot simply do a LIKE-wise search using tax_query.

What you can do is either altering the SQL statement using filters as suggested by @Eric Holmes which is an advanced technique. You need to know what you are doing. Or you could just make a separate query loading the taxonomy terms first (using LIKE) and then loading the actual posts.

Here is a simple sample for loading posts that are in relation to any terms matching a LIKE compare against the $search variable.

//  load the terms using LIKE
$termIds = get_terms([
    'name__like' => $search,
    'fields' => 'ids'
]);


//  load the posts using the found term IDs
$posts = get_posts([
    'tax_query' => [
        'relation' => 'OR',
        [
            'taxonomy' => 'yourtaxonomy',
            'field' => 'id',
            'terms' => $termIds,
        ],
        [
            'taxonomy' => 'othertaxonomy',
            'field' => 'id',
            'terms' => $termIds,
        ],
    ],
]);
1

WP_Tax_Query respectively the Taxonomy Parameter of WP_Query or get_posts() does only take the following for the operator argument:

'operator' string (optional)
Possible values: 'AND', 'IN' or 'NOT IN'.
Default: 'IN'

So you can not use LIKE as operator.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.