Skip to main content
8 of 8
edited body
birgire
  • 67.8k
  • 7
  • 119
  • 251

Append data to the native search:

You can try for example:

add_action( 'pre_get_posts', function( $q ) {
    if( $q->is_main_query() && $q->is_search() )
    {
        $q->set( 'nopaging', true );
        add_filter( 'posts_request', function( $request ) {
            $sql = 'YOUR EXTRA SQL QUERY';
            return "({$request}) UNION ({$sql}) ORDER BY post_status DESC";
        });  
    }
});

where we use the no paging version to match your SQL query.

Reuse the native search query:

Well, if I understand your comment correctly you want to reuse the main search query in your extra SQL query. Here's one idea:

/**
 * Add data to the native WordPress search
 *
 * @see http://wordpress.stackexchange.com/a/161949/26350
 */
add_action( 'pre_get_posts', function( $q ) {
    if( $q->is_main_query() && $q->is_search() )
    {
        $q->set( 'nopaging', true );
        $c = new WPSE_Add_Search_Data;
        $c->init();
    }
});

where the WPSE_Add_Search_Data class defined as:

/**
 * class WPSE_Add_Search_Data
 */
class WPSE_Add_Search_Data
{
    protected $search_where = '';

    public function init()
    {
        add_filter( 'posts_search',  array( $this, 'posts_search'  ) );
        add_filter( 'posts_fields',  array( $this, 'posts_fields'  ) );
        add_filter( 'posts_request', array( $this, 'posts_request' ) );
        add_filter( 'posts_orderby', '__return_null' );
    }

    public function posts_search( $search )
    {
        $this->search_where = $search;
        return $search;
    }

    public function posts_fields( $fields )
    {
        return 'ID, post_title, post_content, post_status';
    }
           
    public function posts_request( $request )
    {
        global $wpdb;

        $search_where = str_ireplace( 
            array( $wpdb->posts . ".post_", "AND (password = '')" ), 
            "", 
            $this->search_where 
        );

        // Fetch data from the external table.
        // The fields much match the fields from the main search query.
        $sql = "SELECT ID, title as post_title, 
                       content as post_content, status as post_status
                FROM {$wpdb->prefix}software_and_hardware_post
                WHERE 1=1 {$search_where} AND status=1";

        // Append the external data with custom order:
        return  "({$request}) UNION ({$sql}) ORDER BY post_status DESC";
    }

} // end class
birgire
  • 67.8k
  • 7
  • 119
  • 251