wp query - How to createmodfiy WP_Query to search in post title OR custom field?

admin2025-01-07  5

I need to modify or create a WP_Query that will search for a search term in both the post title OR a custom field (called 'my_field').

I have been reading and trying for hours, but I am right back to this code (below) which, alas, only searches in 'my_field' and does not take the post_title into account.

function my_pre_get_posts_2( $query ) {
if ( is_admin() && $query->is_main_query() && $query->query['post_type'] === 'post' && isset($query->query['s']) ) {

    $search_word = $query->query['s'];

    $args = array(
        //'s' => $search_word, //If I include this line, the WP query seems to AND post_title and my_field. If I comment out this line, the WP query only searches in my_field
        'post_type' => 'post',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key' => 'my_field',
                'value' => $search_word,
                'compare' => 'IN'
            ),
            array(
                'key' => 'post_title',
                'value' => $search_word,
                'compare' => 'IN',
            )
        )
    );

    //$query = new WP_Query( $args ); //Need to modify the existing WP_Query
    $query->init();
    $query->parse_query($args);
}

}
add_action( 'pre_get_posts', 'my_pre_get_posts_2' );

The reason I need to do this is because I need to modify the behaviour of the the 'Search Posts' button in the 'All Posts' (admin) page so that whatever the admin user searches for, it will return the posts that have a matching post title OR my_field value.

I need to modify or create a WP_Query that will search for a search term in both the post title OR a custom field (called 'my_field').

I have been reading and trying for hours, but I am right back to this code (below) which, alas, only searches in 'my_field' and does not take the post_title into account.

function my_pre_get_posts_2( $query ) {
if ( is_admin() && $query->is_main_query() && $query->query['post_type'] === 'post' && isset($query->query['s']) ) {

    $search_word = $query->query['s'];

    $args = array(
        //'s' => $search_word, //If I include this line, the WP query seems to AND post_title and my_field. If I comment out this line, the WP query only searches in my_field
        'post_type' => 'post',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key' => 'my_field',
                'value' => $search_word,
                'compare' => 'IN'
            ),
            array(
                'key' => 'post_title',
                'value' => $search_word,
                'compare' => 'IN',
            )
        )
    );

    //$query = new WP_Query( $args ); //Need to modify the existing WP_Query
    $query->init();
    $query->parse_query($args);
}

}
add_action( 'pre_get_posts', 'my_pre_get_posts_2' );

The reason I need to do this is because I need to modify the behaviour of the the 'Search Posts' button in the 'All Posts' (admin) page so that whatever the admin user searches for, it will return the posts that have a matching post title OR my_field value.

Share Improve this question edited Dec 30, 2013 at 23:55 fuxia 107k38 gold badges255 silver badges459 bronze badges asked Dec 30, 2013 at 21:46 Boycott A.I.Boycott A.I. 15811 silver badges24 bronze badges
Add a comment  | 

2 Answers 2

Reset to default 0

To do an OR search, I tried merging WP_Query results as shown here - Can i merge 2 new WP_Query($variable) 's? - in guidod's answer. That wasn't a great solution though, and resulted in erratic behaviour.

The correct solution I found was to modify the query using the WP Custom Query as shown in the code (which requires some modifications) here - http://codex.wordpress.org/Custom_Queries ..

To search in both the post title and a custom field using wp_query, you can not directly search in the post_title field because it's not a custom field. Instead, you can use a combination of the meta_query and post_title parameters to achieve your results.

function my_pre_get_posts_2( $query ) {
    if ( is_admin() && $query->is_main_query() && $query->query['post_type'] === 'post' && isset($query->query['s']) ) {

        $search_word = $query->query['s'];

        $args = array(
            'post_type' => 'post',
            'meta_query' => array(
                'relation' => 'OR',
                array(
                    'key' => 'my_field',
                    'value' => $search_word,
                    'compare' => 'LIKE' // Use LIKE to match partial strings in custom fields
                )
            ),
            's' => $search_word, // Search in post title
            'posts_per_page' => -1 // Display all matching posts
        );

        $query->set( 'meta_query', $args['meta_query'] ); // Set meta_query
        $query->set( 's', $args['s'] ); // Set search term for post title

    }
}
add_action( 'pre_get_posts', 'my_pre_get_posts_2' );
转载请注明原文地址:http://conceptsofalgorithm.com/Algorithm/1736263973a931.html

最新回复(0)