Мне кажется скоро надо будет создавать отдельную метку #фильтры_в_админке, потому что у меня уже есть пост про то, как добавить фильтр по элементам таксономий, фильтр записей по автору, а теперь ещё и вот это:
Да, обновление 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; } );
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.