1

is it possibile to search custom post type product by _sku or other custom meta field with input text field? I don't want to use plugin, just need custom WP function.

I have found this solution for search only by title:

function __search_by_title_only($search, &$wp_query)
{
    global $wpdb;
    if (empty($search))
        return $search; // skip processing - no search term in query
    $q = $wp_query->query_vars;
    $n = !empty($q['exact']) ? '' : '%';
    $search =
        $searchand = '';
    foreach ((array) $q['search_terms'] as $term) {
        $term = esc_sql(like_escape($term));
        $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";
        $searchand = ' AND ';
    }
    if (!empty($search)) {
        $search = " AND ({$search}) ";
        if (!is_user_logged_in())
            $search .= " AND ($wpdb->posts.post_password = '') ";
    }
    return $search;
}
add_filter('posts_search', '__search_by_title_only', 500, 2);

... but I need function like this for meta fields ( _sku and _author ).

Thanks !

1
  • You search needs seem relatively complex. for simplicity and performance I'd really reconsider not using a plugin. SearchWP, for example, would work well for your needs as I understand them. Commented Feb 1, 2018 at 12:27

1 Answer 1

0

This might work, not tested though. First add this to join the postmeta table:

add_filter( 'posts_join', 'search_filters_join', 501, 2 );

function search_filters_join( $join, $query ) {
    global $wpdb;

    if ( empty( $query->query_vars[ 'post_type' ] ) || $query->query_vars[ 'post_type' ] !== 'product' ) {
        return $join; // skip processing
    }

    if ( ($this->is_ajax_search() || $this->is_search_page()) && !is_admin() ) {

            $join .= " INNER JOIN $wpdb->postmeta AS customsearch ON ( $wpdb->posts.ID = customsearch.post_id )";
    }


    return $join;
}

Then modify your $search-variable in the foreach-loop as to include the following (this example shows _sku, just add on _author to another OR section if you want to search for that as well):

$search .= "{$searchand} (($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR (customsearch.meta_key='_sku' AND customsearch.meta_value LIKE '{$n}{$term}{$n}'))";
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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