Для различных целей мы можем настраивать вид и функционал админ части сайта. Выводить дополнительные поля, таксономии, сортировать по этим данным, а также оформлять элементы управления.
Миниатюра в панели редактирования
Добавим код в 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>';
}
Выводим колонку с 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;
}
}
}
Добавляем фильтр по метке
За основу данного решения взял плагин 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+).