Добавление фильтра по сайтам в WordPress Multisite

Мне кажется скоро надо будет создавать отдельную метку #фильтры_в_админке, потому что у меня уже есть пост про то, как добавить фильтр по элементам таксономий, фильтр записей по автору, а теперь ещё и вот это:

Фильтр сайтов сети WordPress Мультисайт в админке WordPress
Как вы возможно помните, в WordPress Multisite нет ограничения по количеству сайтов, их спокойно может быть сотня, или тысяча. И поэтому такой фильтр может оказаться очень даже полезным.

Да, обновление 5.3 принесло нам экшн хук restrict_manage_sites, который и позволяет нам добавить свой собственный выпадающий список для фильтрации сайтов на странице всех сайтов, а также фильтр хук ms_sites_list_table_query_args, который поможет нам модифицировать запрос наподобие pre_get_posts и вывести только сайты с определённым значением мета поля.

Стоп, вы ещё не знали? В версии WordPress 5.1 появилась таблица wp_blogmeta и теперь мета данные содержат не только посты, таксономии, комментарии и пользователи, но и сайты внутри сети Мультисайт!

Пример

Предположим, что сайты внутри вашей сети WordPress Мультисайт – это сайты ресторанов. У каждого сайта будет мета поле с ключом cuisine, который обозначает кухню.

Начнём с того, что воспользуемся первым хуком restrict_manage_sites и добавим выпадающий список:

add_action( 'restrict_manage_sites', function( $which ) {
 
	echo '<select name="cuisine"><option value="">Все рестораны</option>';
 
	// для того, чтобы удобнее было проверять на текущее значение
	$cuisines = array(
		'italian'  => 'Итальянская',
		'indian'  => 'Японская',
		'russian' => 'Русская',
		'vietnamese' => 'Вьетнамская',
		'georgian' => 'Грузинская',
	);
 
	// получаем значение из параметра в URL
	$current_cuisine = isset( $_GET['cuisine'] ) ? wp_unslash( $_GET['cuisine'] ) : '';
 
	foreach ( $cuisines as $cuisine => $label ) {
		$selected = selected( $cuisine, $current_cuisine, false );
		printf( '<option%s>%s</option>', $selected, $label );
	}
 
	echo '</select>';
 
	return;
 
} );

Можете пока что не обращать внимание на параметр $which, который пока что при любых обстоятельствах будет равен top (возможно в будущих версиях WordPress это изменится).

Ах да, конечно, вы также можете почитать более детально про функцию selected() и wp_unslash(), если вы не знаете, как они работают. А мы пока что приступаем ко второму шагу – самому процессу фильтрации.

add_filter( 'ms_sites_list_table_query_args', function( $args ) {
 
	// окей, если этого параметра нет в URL, то возвращает $args без изменений
	if ( empty( $_GET['cuisine' ] ) ) {
		return $args;
	}
 
	// наш кусочек meta_query выглядит вот так:
	$meta_query = array(
		'key'   => 'cuisine',
		'value' => wp_unslash( $_GET['cuisine' ] ),
	);
 
	// если какие-то meta_query УЖЕ существуют, мы не можем их перезаписать!
	if ( isset( $args['meta_query'] ) ) {
 
		// поэтому мы добавляем нашу к уже существующим
		$args['meta_query'] = array(
			'relation' => 'AND',
			$meta_query,
			array( $args['meta_query'] ),
		);
 
	} else {
 
		// только если других meta_query нет!
		$args['meta_query'] = array( $meta_query );
 
	}
 
	return $args;
 
} );

Что ещё принесло нам обновление WordPress 5.3

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, если же код – меньше одной строчки, то можно и в <code></code>.