• Hi,
    Please I have a some problem with filters in search in WordPress, it’s for a music website and I need to filter the search by artist (taxonomy), album (title, thats ok), songs (meta) and regular search. I only have album and regular, but I have some problems with artist and songs. Please help me.

    class Search_Filters{
    	function __construct(){
    		add_filter( 'query_vars', array($this,'register_vars') );
    		$this->search_hooks();
    	}
    
    	function register_vars($vars){
    		$vars[] = "type";
    		return $vars;
    	}
    
    	function search_hooks(){
    
    		if ( get_query_var('type')=='artista' ) {
    			add_filter( 'posts_join', array( &$this, 'search_by_artista_join' ), 10, 2);
    			add_filter( 'posts_where', array( &$this, 'search_by_artista_where' ), 10, 2);
    		}
    
    		add_filter( 'posts_search', array( &$this, 'search_where' ), 10, 2 );
    
    		add_filter( 'posts_where', array( &$this, 'no_revisions' ) );
    		add_filter( 'posts_where', array( &$this, 'no_future' ) );
    	}
    
    	function search_where($where, $wp_query){
    		if ( !$wp_query->is_search() )
    			return $where;
    
    		$this->query_instance = &$wp_query;
    		global $wpdb;
    
    		$searchQuery = $this->search_default();
    
    		if( get_query_var('type')=='album' ){
    			$searchQuery = $this->search_by_title();
    		}
    		if( get_query_var('type')=='artista' ){
    			$searchQuery = $this->search_by_artista_where();
    		}
    
    		if ( $searchQuery != '' ) {
    			$where = preg_replace( '#\(\(\(.*?\)\)\)#', '(('.$searchQuery.'))', $where );
    		}
    
    		return $where;
    	}
    
    	function search_default(){ 
    
    		global $wpdb;
    
    		$not_exact = empty($this->query_instance->query_vars['exact']);
    		$search_sql_query = '';
    		$seperator = '';
    		$terms = $this->get_search_terms();
    
    		// if it's not a sentance add other terms
    		$search_sql_query .= '(';
    		foreach ( $terms as $term ) {
    			$search_sql_query .= $seperator;
    
    			$esc_term = esc_sql($term);
    			if ($not_exact) {
    				$esc_term = "%$esc_term%";
    			}
    
    			$like_title = "($wpdb->posts.post_title LIKE '$esc_term')";
    			$like_post = "($wpdb->posts.post_content LIKE '$esc_term')";
    
    			$search_sql_query .= "($like_title OR $like_post)";
    
    			$seperator = ' AND ';
    		}
    
    		$search_sql_query .= ')';
    		return $search_sql_query;
    	}
    
    	function search_by_title(){ 
    
    		global $wpdb;
    
    		$not_exact = empty($this->query_instance->query_vars['exact']);
    		$search_sql_query = '';
    		$seperator = '';
    		$terms = $this->get_search_terms();
    
    		// if it's not a sentance add other terms
    		$search_sql_query .= '(';
    		foreach ( $terms as $term ) {
    			$search_sql_query .= $seperator;
    
    			$esc_term = esc_sql($term);
    			if ($not_exact) {
    				$esc_term = "%$esc_term%";
    			}
    
    			$like_title = "($wpdb->posts.post_title LIKE '$esc_term')";
    
    			$search_sql_query .= "($like_title)";
    
    			$seperator = ' AND ';
    		}
    
    		$search_sql_query .= ')';
    		return $search_sql_query;
    	}
    
    	function search_by_artista(){ 
    
    		global $wpdb;
    
    		$not_exact = empty($this->query_instance->query_vars['exact']);
    		$search_sql_query = '';
    		$seperator = '';
    		$terms = $this->get_search_terms();
    
    		// if it's not a sentance add other terms
    		$search_sql_query .= '(';
    		foreach ( $terms as $term ) {
    			$search_sql_query .= $seperator;
    
    			$esc_term = esc_sql($term);
    			if ($not_exact) {
    				$esc_term = "%$esc_term%";
    			}
    
    			$like_title = "($wpdb->posts.post_title LIKE '$esc_term')";
    			$like_post = "($wpdb->posts.post_content NOT LIKE '$esc_term')";
    
    			$search_sql_query .= "($like_title OR $like_post)";
    
    			$seperator = ' AND ';
    		}
    
    		$search_sql_query .= ')';
    		return $search_sql_query;
    	}
    
    	function search_by_artista_join( $join ) {
    		global $wpdb;
    
    		if ( !empty( $this->query_instance->query_vars['s'] ) ) {
    			//	join term_relationships, term_taxonomy, and terms into the current SQL where clause
    			$join .= "
    			INNER JOIN
    			  {$wpdb->term_relationships} ON {$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id
    			INNER JOIN
    			  {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id = {$wpdb->term_relationships}.term_taxonomy_id
    			INNER JOIN
    			  {$wpdb->terms} ON {$wpdb->terms}.term_id = {$wpdb->term_taxonomy}.term_id ";
    
    		}
    
    		return $join;
    	}
    /*
    	function search_by_artista_join( $join ) {
    		global $wpdb;
    
    		if ( !empty( $this->query_instance->query_vars['s'] ) ) {
    
    			// if we're searching for categories
    			if ( $this->options['se_use_category_search'] ) {
    				$on[] = "ttax.taxonomy = 'artista'";
    			}
    
    			$on = ' ( ' . implode( ' OR ', $on ) . ' ) ';
    
    			$join .= " LEFT JOIN $wpdb->term_relationships AS trel ON ($wpdb->posts.ID = trel.object_id) LEFT JOIN $wpdb->term_taxonomy AS ttax ON ( " . $on . " AND trel.term_taxonomy_id = ttax.term_taxonomy_id) LEFT JOIN $wpdb->terms AS tter ON (ttax.term_id = tter.term_id) ";
    		}
    		//$this->se_log( "tags join: ".$join );
    		return $join;
    	}
    */
    	function search_by_artista_where( $where, $query ){
    		global $wpdb;
    		if ( !empty( $this->query_instance->query_vars['s'] ) ) {
    			$where .= " OR ( {$wpdb->term_taxonomy}.taxonomy IN('artista') ";
     			$where .= " AND {$wpdb->terms}.name LIKE '%" . $wpdb->escape( get_query_var('s') ) . "%' )";
    		}
    		return $where;
    	}
    
    	function get_search_terms() {
    		global $wpdb;
    		$s = isset( $this->query_instance->query_vars['s'] ) ? $this->query_instance->query_vars['s'] : '';
    		$sentence = isset( $this->query_instance->query_vars['sentence'] ) ? $this->query_instance->query_vars['sentence'] : false;
    		$search_terms = array();
    
    		if ( !empty( $s ) ) {
    			// added slashes screw with quote grouping when done early, so done later
    			$s = stripslashes( $s );
    			if ( $sentence ) {
    				$search_terms = array( $s );
    			} else {
    				preg_match_all( '/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $s, $matches );
    				$search_terms = array_map( create_function( '$a', 'return trim($a, "\\"\'\\n\\r ");' ), $matches[0] );
    			}
    		}
    		return $search_terms;
    	}
    
    	// FIXES
    	function no_revisions( $where ) {
    		global $wpdb;
    		if ( !empty( $this->query_instance->query_vars['s'] ) ) {
    			if ( !$this->wp_ver28 ) {
    				$where = 'AND (' . substr( $where, strpos( $where, 'AND' )+3 ) . ") AND $wpdb->posts.post_type != 'revision'";
    			}
    			$where = ' AND (' . substr( $where, strpos( $where, 'AND' )+3 ) . ') AND post_type != \'revision\'';
    		}
    		return $where;
    	}
    
    	function no_future( $where ) {
    		global $wpdb;
    		if ( !empty( $this->query_instance->query_vars['s'] ) ) {
    			if ( !$this->wp_ver28 ) {
    				$where = 'AND (' . substr( $where, strpos( $where, 'AND' )+3 ) . ") AND $wpdb->posts.post_status != 'future'";
    			}
    			$where = 'AND (' . substr( $where, strpos( $where, 'AND' )+3 ) . ') AND post_status != \'future\'';
    		}
    		return $where;
    	}
    
    }

The topic ‘HELP Search filters’ is closed to new replies.