Add_Custom_Fields_To_Search
On This Page
Description Description
An object that modifies the WordPress search query to include custom fields
See also See also
Source Source
File: includes/class-add-custom-fields-to-search.php
class Add_Custom_Fields_To_Search { /** * Adds hooks * * @return void */ public function add_hooks() { add_filter( 'posts_distinct', array( $this, 'cf_search_distinct' ) ); add_filter( 'posts_join', array( $this, 'cf_search_join' ) ); add_filter( 'posts_where', array( $this, 'cf_search_where' ) ); } /** * Are we looking at the Media Library? * * @return bool */ protected function is_media_library() { return 'upload.php' === basename( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ?? '' ) ), '?' . sanitize_text_field( wp_unslash( $_SERVER['QUERY_STRING'] ?? '' ) ) ); } /** * Prevent duplicate posts from showing up in search results. * * @link https://developer.wordpress.org/reference/hooks/posts_distinct/ * * @param string $distinct The part of the query that contains the word * DISTINCT. * @return string */ public function cf_search_distinct( $distinct ) { if ( is_search() ) { return 'DISTINCT'; } return $distinct; } /** * Join posts and postmeta tables * * @see https://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join * * @param string $join The JOIN clause of the query. * @return string */ public function cf_search_join( $join ) { global $wpdb; if ( ! is_search() || $this->is_media_library() ) { return $join; } // join to search post meta values like year, make, model, trim, etc. $join .= " LEFT JOIN $wpdb->postmeta searchmeta ON $wpdb->posts.ID = searchmeta.post_id "; return $join; } /** * Modify the search query with posts_where * * @see https://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where * * @param string $where * @return string */ public function cf_search_where( $where ) { if ( ! is_search() || $this->is_media_library() ) { return $where; } global $wpdb; $where = preg_replace( "/\(\s*$wpdb->posts.post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "($wpdb->posts.post_title LIKE $1) OR ( searchmeta.meta_value LIKE $1 ) ", $where ); return $where; } }
Expand full source codeCollapse full source codeView on Github
Methods Methods
- add_hooks — Adds hooks
- cf_search_distinct — Prevent duplicate posts from showing up in search results.
- cf_search_join — Join posts and postmeta tables
- cf_search_where — Modify the search query with posts_where
- is_media_library — Are we looking at the Media Library?
Changelog Changelog
Version | Description |
---|---|
1.2.1 | Introduced. |