Wyszukiwarka wpisów – kategoria

Domyślnie wyszukiwarka wpisów WordPress przeszukuje tylko tytuły i treść wpisu. Aby w wyszukiwaniu uwzględnić również kategorię wpisu należy w pliku functions.php motywu dodać dwa poniższe fragmenty kodu. Pierwszy z nich tworzy klasę, która implementuje metody odpowiedzialne za wyszukiwanie wg taksonomii. Drugi fragment tworzy obiekt klasy, dla kategorii.

taxonomy = $taxonomy;
		$this->slug = str_replace( '-', '_', $this->taxonomy );
		add_filter( 'posts_join', array( $this, 'posts_join' ) , 10, 2 );
		add_filter( 'posts_where', array( $this, 'posts_where' ), 10, 2 );
		add_filter( 'posts_groupby', array( $this, 'posts_groupby' ), 10, 2 );
	}

	public function posts_join( $join, $query ) {
		global $wpdb;
		if ( is_main_query() && is_search() ) {
			$join .= "
                LEFT JOIN
                (
                    {$wpdb->term_relationships} AS term_relationship_search_by_taxonomy_{$this->slug}
                    INNER JOIN
                        {$wpdb->term_taxonomy} AS term_taxonomy_search_by_taxonomy_{$this->slug} 
                        ON term_taxonomy_search_by_taxonomy_{$this->slug}.term_taxonomy_id = term_relationship_search_by_taxonomy_{$this->slug}.term_taxonomy_id
                    INNER JOIN
                        {$wpdb->terms} terms_search_by_taxonomy_{$this->slug} 
                        ON terms_search_by_taxonomy_{$this->slug}.term_id = term_taxonomy_search_by_taxonomy_{$this->slug}.term_id
                )
                ON {$wpdb->posts}.ID = term_relationship_search_by_taxonomy_{$this->slug}.object_id  
            ";
		}
		return $join;
	}

	public function posts_where( $where, $query ) {
		global $wpdb;
		if ( is_main_query() && is_search() ) {
			$where .= " OR (
                            term_taxonomy_search_by_taxonomy_{$this->slug}.taxonomy = '{$this->taxonomy}'
                            AND (
                                terms_search_by_taxonomy_{$this->slug}.name LIKE '%" . $wpdb->esc_like( get_query_var( 's' ) ) . "%'
                                )
                      )";
		}
		return $where;
	}

	public function posts_groupby( $groupby, $query ) {
		global $wpdb;
		if ( is_main_query() && is_search() ) {
			$groupby = "{$wpdb->posts}.ID";
		}
		return $groupby;
	}

}

View the code on Gist.


View the code on Gist.

Kopiując kod pomiń znacznik <?php - w większości przypadków nie ma potrzeby dodawania go do pliku functions.php. Jeżeli nie używasz motywu potomnego pamiętaj o tym, że zmiany wprowadzone do pliku functions.php zostaną nadpisane podczas aktualizacji motywu.

O grola

Pasjonat Wordpressa i WooCommerce od wielu lat. Autor wtyczek i krótkich snippetów usprawniających działanie Wordpressa i WooCommerce.

Pokaż wszystkie wpisy grola →