/ Wordpress / Настраиваем панель редактирования записей

Настраиваем панель редактирования записей

HIT

02.10.2016

2259

Для различных целей мы можем настраивать вид и функционал админ части сайта. Выводить дополнительные поля, таксономии, сортировать по этим данным, а также оформлять элементы управления.

Миниатюра в панели редактирования

Добавим код в functions.php. Последний блок — привязка к постам и страницам.

add_image_size( 'admin-list-thumb', 80, 80, false );

// add featured thumbnail to admin post columns
function wpcs_add_thumbnail_columns( $columns ) {
	$columns = array(
		'cb' => '<input type="checkbox" />',
		'featured_thumb' => 'Миниатюра',
		'title' => 'Title',
		'author' => 'Author',
		'categories' => 'Categories',
		'tags' => 'Tags',
		'comments' => '<span class="vers"><div title="Comments" class="comment-grey-bubble"></div></span>',
		'date' => 'Date'
	);
	return $columns;
}

function wpcs_add_thumbnail_columns_data( $column, $post_id ) {
	switch ( $column ) {
		case 'featured_thumb':
		echo '<a href="' . get_edit_post_link() . '">';
		echo the_post_thumbnail( 'admin-list-thumb' );
		echo '</a>';
		break;
	}
}

if ( function_exists( 'add_theme_support' ) ) {
	add_filter( 'manage_posts_columns' , 'wpcs_add_thumbnail_columns' );
	add_action( 'manage_posts_custom_column' , 'wpcs_add_thumbnail_columns_data', 10, 2 );
	add_filter( 'manage_pages_columns' , 'wpcs_add_thumbnail_columns' );
	add_action( 'manage_pages_custom_column' , 'wpcs_add_thumbnail_columns_data', 10, 2 );
}

В данном решении мы создали дополнительный размер миниатюры. Это необязательно, можно использовать стандартный или свой размер.

Если нужно добавить функцию к определенному типу записей, то нужно его прописать здесь:

add_filter( 'manage_slide_posts_columns' , 'wpcs_add_thumbnail_columns' );
add_action( 'manage_slide_posts_custom_column' , 'wpcs_add_thumbnail_columns_data', 10, 2 );

Взять в виде миниатюры первое изображение Featured Gallery:

function wpcs_add_thumbnail_columns_data( $column, $post_id ) {
	$galleryArray = get_post_gallery_ids($post_id);
	switch ( $column ) {
		case 'featured_thumb':
		echo wp_get_attachment_image( $galleryArray[0], 'thumbnail' );
		break;
	}
}

Добавляем цвета к статусам

// Colours posts rows depending on the status
add_action( 'admin_footer', 'admin_footer_example' );
function admin_footer_example() {
    echo '<style type="text/css">
    .status-draft   { background: #FCE3F2 !important; }
    .status-pending { background: #87C5D6 !important; }
    .status-future  { background: #C6EBF5 !important; }
    .status-private { background: #F2D46F !important; }
    </style>';
}
Если не задать свойствам атрибут !important, то четные записи будут серыми, т.к. их будет перекрывать стандартный перемежающийся фон wordpress

Выводим колонку с ID

if (is_admin()) {
	// колонка "ID" для постов и страниц в админке
	add_filter('manage_posts_columns', 'posts_add_col', 5);
	add_action('manage_posts_custom_column', 'posts_show_id', 5, 2);
	add_filter('manage_pages_columns', 'posts_add_col', 5);
	add_action('manage_pages_custom_column', 'posts_show_id', 5, 2);
	add_action('admin_print_styles-edit.php', 'posts_id_style');
	function posts_add_col($defaults) {$defaults['wps_post_id'] = __('ID'); return $defaults;}
	function posts_show_id($column_name, $id) {if ($column_name === 'wps_post_id') echo $id;}
	function posts_id_style() {print '<style>#wps_post_id{width:4em}</style>';} 
}

Удалить лишнюю колонку

Удаляем колонку коментарии

//удаление колонки комментариев в списке
function wph_remove_comments_column($defaults) {
    unset($defaults['comments']);
    unset($defaults['categories']);
    return $defaults;
}
add_filter('manage_pages_columns', 'wph_remove_comments_column');
add_filter('manage_posts_columns', 'wph_remove_comments_column');

Удалить колонки All in One SEO Pack

function wph_remove_comments_column($defaults) {
    unset($defaults['seotitle']);
    unset($defaults['seodesc']);
    unset($defaults['seokeywords']);
    return $defaults;
}
add_filter('manage_pages_columns', 'wph_remove_comments_column', 999);
add_filter('manage_posts_columns', 'wph_remove_comments_column', 999);

Добавить колонку с пользовательским полем (acf)

price — slug пользовательского поля

// Создаем колонку Price
function add_acf_columns ( $columns ) {
$columns['price'] = 'Price';
    return $columns;
}
add_filter ( 'manage_post_posts_columns', 'add_acf_columns' );

// Заполняем колонку данными из поля price
add_action('manage_posts_custom_column', 'shiba_render_post_columns', 10, 2);
 
function shiba_render_post_columns($column_name, $id) {
    switch ($column_name) {
    case 'price':
        $price_id = get_post_meta( $id, 'price', TRUE);
		echo $price_id;
    break;
    }
}

По добавлению мета полей (не acf) подробнее здесь.

Добавить колонку Дата изменения записи

// Колонка Дата изменения записи

// Register the column
function modified_column_register( $columns ) {
    $columns['modified_list'] = __( 'Дата изменения', 'my-plugin' );
  
    return $columns;
}
add_filter( 'manage_edit-post_columns', 'modified_column_register' );
 
// Display the column content
function modified_column_display( $column_name, $post_id ) {
    if ( 'modified_list' != $column_name )
        return;
    echo the_modified_date();
	echo ' в ';
	echo the_modified_time();
	
	// либо можно вывести так
	// echo the_modified_date('d.m.Y в G:i');
}
add_action( 'manage_posts_custom_column', 'modified_column_display', 10, 2 );

Можно добавить сортировку по данной колонке — см. следующий абзац, но функция привязываемая к pre_get_posts будет в разы проще т.к. можно установить в orderby значение modified (сортировка по дате изменения).

Добавить колонку с метаполем дата и сортировкой по ней

Основным условием правильной сортировки в этом случае является формат сохранения даты в метаполе, он должен быть такой: Y-m-d (2021-10-04). В противном случае сортировка работать не будет.

// Колонка Дата изменения записи (не date modified)

// Register the column
function modified_column_register( $columns ) {
    $columns['last_update'] = __( 'Дата изменения', 'my-plugin' );
  
    return $columns;
}
add_filter( 'manage_edit-post_columns', 'modified_column_register' );
 
// Display the column content
function modified_column_display( $column_name, $post_id ) {
    if ( 'last_update' != $column_name )
        return;
		echo get_post_meta($post_id, 'last_update', true);
}
add_action( 'manage_posts_custom_column', 'modified_column_display', 10, 2 );



add_filter( 'manage_edit-post_sortable_columns', 'last_update_manage_sortable_columns' );
function last_update_manage_sortable_columns( $sortable_columns ) {
   $sortable_columns['last_update'] = 'last_update';
   return $sortable_columns;
}

add_action( 'pre_get_posts', 'manage_wp_posts_be_qe_pre_get_posts', 1 );
function manage_wp_posts_be_qe_pre_get_posts( $query ) {
	
   if ( $query->is_main_query() && ( $orderby = $query->get( 'orderby' ) ) ) {

        switch( $orderby ) {
			case 'last_update':

				$meta_query = array(
					array(
						'key'     => 'last_update',
						'value'   => date('Y-m-d'),
						'type'    => 'DATE',
						'compare' => '<='
					)
				);

				$query->set( 'orderby', 'meta_value' );
				$query->set( 'meta_key', 'last_update' );	
				$query->set( 'meta_query', $meta_query );				

			break;
        }
   }
}

Сортировка по произвольной колонке

Добавим сортировку по пользовательской колонке price

add_filter( 'manage_edit-post_sortable_columns', 'my_website_manage_sortable_columns' );
function my_website_manage_sortable_columns( $sortable_columns ) {
   $sortable_columns['price'] = 'price';
   return $sortable_columns;
}


add_action( 'pre_get_posts', 'manage_wp_posts_be_qe_pre_get_posts', 1 );
function manage_wp_posts_be_qe_pre_get_posts( $query ) {
   if ( $query->is_main_query() && ( $orderby = $query->get( 'orderby' ) ) ) {
        switch( $orderby ) {
			case 'price':
				$query->set( 'meta_key', 'price' );
				$query->set( 'orderby', 'meta_value' );
			break;
        }
   }
}
Если смешанный тип данных текст и числа лучше использовать meta_value. Если только числа то meta_value_num

Добавляем фильтр по метке

За основу данного решения взял плагин Admin post tag filter (100). Он у меня не работал, пришлось подправить одну строку (выделено жирным).

function aptf_manage_posts_by_tag(){
	global $wp_taxonomies;
	if ( is_array( $wp_taxonomies ) ) {
		$no_category_and_links = array('');
		foreach( $wp_taxonomies as $tax ) {
			
				if($tax->name == 'post_tag'){ 
				$the_terms = get_terms($tax->name,'orderby=name&hide_empty=0' );
				$content  = '<select name="'.$tax->name.'" id="'.$tax->name.'" class="posttagfilter">';
				$content .= '<option value=""> All '.$tax->label.'</option>';
				
				foreach ($the_terms as $term){
					$selected_tag = '';
					$content .= '<option value="' . $term->slug . '"> '. $term->slug . '</option>';
				}
				
				$content .= '</select>';
				$content = str_replace('post_tag', 'tag', $content); 
				echo($content);
			}
		}
	}
}

add_action('restrict_manage_posts', 'aptf_manage_posts_by_tag');

Изменяя строку if($tax->name == ‘post_tag’) можно выводить фильтр по любой таксономии.

Добавляем фильтр по автору

Решение от Мишы Рудастых.

function true_filtr_po_avtoram() {
	$parameters = array(
		'name' => 'author',
		'show_option_all' => 'Все авторы'
	);
 
	if ( isset($_GET['user']) )
		$parameters['selected'] = $_GET['user'];
 
	wp_dropdown_users( $parameters );
}
 
add_action('restrict_manage_posts', 'true_filtr_po_avtoram');

Фильтр по произвольному полю

// Фильтр по произвольному полю (branch)
function wisdom_filter_tracked_plugins() {
	global $wp_query;
	$plugins = array( 'МАГАЗИНЫ / СЕТИ', 'СТО', 'Интернет-магазины', 'Автопарки', 'Индустриальные объекты' ); // Options for the filter select field
	$current_plugin = '';
	if( isset( $_GET['branch'] ) ) {
		$current_plugin = $_GET['branch']; // Check if option has been selected
	} ?>
	<select name="branch" id="branch">
		<option value="Все отрасли" <?php selected( 'Все отрасли', $current_plugin ); ?>><?php _e( 'Все отрасли', 'wisdom-plugin' ); ?></option>
		
		<?php foreach( $plugins as $key=>$value ) { ?>
			<option value="<?php echo esc_attr( $value ); ?>" <?php selected( $value, $current_plugin ); ?>><?php echo esc_attr( $value ); ?></option>
		<?php } ?>
	</select>
	<?php
}
add_action( 'restrict_manage_posts', 'wisdom_filter_tracked_plugins' );


function wisdom_sort_plugins_by_meta_field( $query ) {
	global $pagenow;
	if ( is_admin() && $pagenow=='edit.php' && isset( $_GET['branch'] ) && $_GET['branch'] !='Все отрасли' ) {
	$meta_query = array(
            array(
                'key' => 'branch',
                'value' => $_GET['branch'],
            )
        );
        $query->set( 'meta_query', $meta_query );
	}
}
add_filter( 'parse_query', 'wisdom_sort_plugins_by_meta_field' );

Два и более фильтров по произвольному полю

Выводим 2 поля управления фильтрами в одной функции:

// Фильтры по произвольным полям (Статус и Тип)
function wisdom_filter_tracked_plugins() {
	global $wp_query;
	$plugins = array( 'Работающая торговая точка', 'Потенциальный клиент', 'Отгрузка прекращена' ); // Options for the filter select field
	$current_plugin = '';
	if( isset( $_GET['condition'] ) ) {
		$current_plugin = $_GET['condition']; // Check if option has been selected
	} ?>
	<select name="condition" id="condition">
		<option value="Все статусы" <?php selected( 'Все статусы', $current_plugin ); ?>><?php _e( 'Все статусы', 'wisdom-plugin' ); ?></option>
		
		<?php foreach( $plugins as $key=>$value ) { ?>
			<option value="<?php echo esc_attr( $value ); ?>" <?php selected( $value, $current_plugin ); ?>><?php echo esc_attr( $value ); ?></option>
		<?php } ?>
	</select>

	<?php $plugins_2 = array( 'Легковые', 'Грузовые', 'Сетевые' ); // Options for the filter select field
	$current_plugin_2 = '';
	if( isset( $_GET['kind'] ) ) {
		$current_plugin_2 = $_GET['kind'];
	} ?>

	<select name="kind" id="kind">
		<option value="Все типы" <?php selected( 'Все типы', $current_plugin_2 ); ?>><?php _e( 'Все типы', 'wisdom-plugin' ); ?></option>
		
		<?php foreach( $plugins_2 as $key=>$value ) { ?>
			<option value="<?php echo esc_attr( $value ); ?>" <?php selected( $value, $current_plugin_2 ); ?>><?php echo esc_attr( $value ); ?></option>
		<?php } ?>
	</select>

	<?php
}
add_action( 'restrict_manage_posts', 'wisdom_filter_tracked_plugins' );

А в функции изменения запроса делаем разные запросы в зависимости от выбранных полей

function wisdom_sort_plugins_by_meta_field( $query ) {
	global $pagenow;
	if ( is_admin() && $pagenow=='edit.php' ) {
		
		if ( isset( $_GET['condition'] ) && $_GET['condition'] !='Все статусы' && isset( $_GET['kind'] ) && $_GET['kind'] !='Все типы' ) {
			
			$meta_query = array(
				array(
					'key' => 'condition',
					'value' => $_GET['condition'],
				),
				array(
					'key' => 'kind',
					'value' => $_GET['kind'],
				),			
			);
			$query->set( 'meta_query', $meta_query );
			
		} elseif ( isset( $_GET['condition'] ) && $_GET['condition'] !='Все статусы' ) {
			
			$meta_query = array(
				array(
					'key' => 'condition',
					'value' => $_GET['condition'],
				),		
			);
			$query->set( 'meta_query', $meta_query );			
			
		} elseif ( isset( $_GET['kind'] ) && $_GET['kind'] !='Все типы' ) {
			
			$meta_query = array(
				array(
					'key' => 'kind',
					'value' => $_GET['kind'],
				),			
			);
			$query->set( 'meta_query', $meta_query );			
			
		}
		
	}
}
add_filter( 'parse_query', 'wisdom_sort_plugins_by_meta_field' );

Массовое изменение категорий

Массово добавить записям категории возможно, а вот удалить нет. Если требуется отредактировать (в т.ч. какие-то удалить) массово категории у записей — нужно воспользоваться плагином Mass set Categories (300+).

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Изменяем админку Woocommerce

Изменяем админку Woocommerce

В данной статье собираются сниппеты меняющие функционал или внешний вид админ части Woocommerce. Вернуть выпадающий список категорий С версии WC 3.2 изменился фильтр постов в админке, конкретно выбор категории. Теперь Читать далее »

/
Заглушка для сайта

Заглушка для сайта

Во время разработки / тех.обслуживания / тестинга нужно вставить код в functions function rezim_obsluzivania() { if ( !current_user_can( 'administrator' ) ) { wp_die('Сайт находится в режиме обслуживания, производятся обновления. Зайдите Читать далее »

/
Оформляем вход в админку

Оформляем вход в админку

Чтобы индивидуализировать экран входа в админку, надо добавить в functions.php следующюю функцию // Изменение стилей (логотипа) на входе в WP function loginLogo() { echo '<style type="text/css"> body {background-image: url('.get_bloginfo('template_directory').'/images/heaven.jpg); background-attachment: Читать далее »

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

Пока нет комментариев. Будь первым!

Настраиваем панель редактирования записей Настраиваем панель редактирования записей
Циклы wordpress (основа основ)
Рекомендации для васЦиклы wordpress (основа основ)Opttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.