Как сделать поиск по авторам в Вордпресс

Опубликовано 6 лет назад

В Вордпресс поиск по сайту осуществляется только по телу записей. Иногда этого недостаточно. Например, если в блоге публикуются несколько авторов, и посетитель введет в поиске кого-то из них, логично полагая увидеть их публикации, то Вордпресс ничего не найдет. Покажу, как это исправить.

Пару лет назад я уже рассказывал, как сделать поиск по произвольным полям Вордпресс. Поиск по авторам — похожая и вполне тривиальная задача. У нее существует множество решений, в том числе и в виде готовых плагинов. Все решения сводятся к хуку posts_search.

Одно из рабочих решений от Daniel Bachhuber:

add_filter( 'posts_search', 'db_filter_authors_search' );
function db_filter_authors_search( $posts_search ) {

	if ( !is_search() || empty( $posts_search ) )
		return $posts_search;

	global $wpdb;

	add_filter( 'pre_user_query', 'db_filter_user_query' );
	$search = sanitize_text_field( get_query_var( 's' ) );
	$args = array(
		'count_total' => false,
		'search' => sprintf( '*%s*', $search ),
		'search_fields' => array(
			'display_name',
			'user_login',
		),
		'fields' => 'ID',
	);
	$matching_users = get_users( $args );
	remove_filter( 'pre_user_query', 'db_filter_user_query' );

	if ( empty( $matching_users ) )
		return $posts_search;

	$posts_search = str_replace( ')))', ")) OR ( {$wpdb->posts}.post_author IN (" . implode( ',', array_map( 'absint', $matching_users ) ) . ")))", $posts_search );
	return $posts_search;
}

function db_filter_user_query( &$user_query ) {

	if ( is_object( $user_query ) )
		$user_query->query_where = str_replace( "user_nicename LIKE", "display_name LIKE", $user_query->query_where );
	return $user_query;

}

Напомню, фильтр размещаем в файле функций (functions.php) активной темы.

Иван Данилин
Автор Иван Данилин

Фулстек веб‑разработчик, специализируюсь на платформе WordPress

Подробнее
Добавить комментарий