2

Trying to modify default admin search by including search by custom post type fields,

Below is my code,

function custom_search_query( $query ) {
    $custom_fields = array(
        // put all the meta fields you want to search for here
        "rg_1job_designation",
        "rg_2job_designation"
    );
    $searchterm = $query->query_vars['s'];
    // we have to remove the "s" parameter from the query, because it will prevent the posts from being found
    $query->query_vars['s'] = "";
    if ($searchterm != "") {
        $meta_query = array('relation' => 'OR');
        foreach($custom_fields as $cf) {
            array_push($meta_query, array(
                'key' => $cf,
                'value' => $searchterm,
                'compare' => 'LIKE'
            ));
        }
        $query->set("meta_query", $meta_query);
    };
}
add_filter( "pre_get_posts", "custom_search_query");

But it's not working.

i have a post title -> John & Designation -> Designer On search by Designer can get 1 result, But on search of John result is empty (This should also fetch one result). Now the default search for title is lost want to use that too.

Did anyone know what's wrong in my code?

2
  • I realize my answer is not helping, so deleted it. Your problem is something I've came across before. Please refer to this post, I use their code to the rescue.
    – 1fixdotio
    Commented Jan 31, 2014 at 8:07
  • Use above edited codes now i can able to filter by meta_value. But now default search for title gets lost. Any idea to use both ?
    – Vin_fugen
    Commented Jan 31, 2014 at 10:42

1 Answer 1

5

With this code you can search in post list in WordPress Admin Panel with custom post meta values along with title and other default fields.

Please, add below code in functions.php file:

if (!function_exists('extend_admin_search')) {
    add_action('admin_init', 'extend_admin_search');

    /**
     * hook the posts search if we're on the admin page for our type
     */
    function extend_admin_search() {
        global $typenow;

        if ($typenow === 'your_custom_post_type') {
            add_filter('posts_search', 'posts_search_custom_post_type', 10, 2);
        }
    }

    /**
     * add query condition for custom meta
     * @param string $search the search string so far
     * @param WP_Query $query
     * @return string
     */
    function posts_search_custom_post_type($search, $query) {
        global $wpdb;

        if ($query->is_main_query() && !empty($query->query['s'])) {
            $sql    = "
            or exists (
                select * from {$wpdb->postmeta} where post_id={$wpdb->posts}.ID
                and meta_key in ('rg_1job_designation','rg_2job_designation')
                and meta_value like %s
            )
        ";
            $like   = '%' . $wpdb->esc_like($query->query['s']) . '%';
            $search = preg_replace("#\({$wpdb->posts}.post_title LIKE [^)]+\)\K#",
                $wpdb->prepare($sql, $like), $search);
        }

        return $search;
    }
}
5
  • This is awesome thanks. What if we want to add results from "Custom Field A" OR "Custom Field B"? I mean: "if search word is present on CFA show results, if not, look into CFB and show results". I can see you had two different custom fields 'rg_1job_designation','rg_2job_designation' but I am not sure if the keyword has to be in both or them to generate a resutl, or if the relationship between both is an "OR" operator...
    – Peanuts
    Commented Oct 11, 2020 at 20:00
  • 1
    I can confirm we can add different meta fields where the ('rg_1job_designation','rg_2job_designation') is and the Search will go through all of them. MANY THANKS!
    – Peanuts
    Commented Oct 11, 2020 at 20:37
  • You're welcome. Yes, it can be used for any number of custom fields. Commented Oct 12, 2020 at 5:43
  • Thanks for decision but it's not working for numeric search values Commented Aug 5, 2021 at 14:10
  • Thanks! This was really helpful
    – Gavin
    Commented Sep 9 at 6:15

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.