Добавление пользовательских колонок в произвольные типы записей
Хуки для создания пользовательских колонок и связанных с ними данных для произвольного типа записи — это manage_{$post_type}_posts_columns
и manage_{$post_type}_posts_custom_column
соответственно, где {$post_type}
— это название произвольного типа записи.
Этот пример из документации удаляет колонку автора и добавляет колонки для таксономии и метаданных:
// Добавляем пользовательские колонки для типа записи "book":
add_filter( 'manage_book_posts_columns', 'set_custom_edit_book_columns' );
function set_custom_edit_book_columns($columns) {
unset( $columns['author'] );
$columns['book_author'] = __( 'Автор', 'your_text_domain' );
$columns['publisher'] = __( 'Издатель', 'your_text_domain' );
return $columns;
}
// Добавляем данные в пользовательские колонки для типа записи "book":
add_action( 'manage_book_posts_custom_column' , 'custom_book_column', 10, 2 );
function custom_book_column( $column, $post_id ) {
switch ( $column ) {
case 'book_author' :
$terms = get_the_term_list( $post_id , 'book_author' , '' , ',' , '' );
if ( is_string( $terms ) )
echo $terms;
else
_e( 'Не удалось получить автора(ов)', 'your_text_domain' );
break;
case 'publisher' :
echo get_post_meta( $post_id , 'publisher' , true );
break;
}
}

Спасибо за этот хук!!! Это гениально!! На stackoverflow нет четкой документации!!! :D Ура, приятель

Нет ли возможности установить номер столбца? Например, column_index[2]
. Потому что custom_column появляется в конце столбца.

@DilipGupta $columns - это массив, вы можете изменить порядок перед возвратом

В случае добавления колонки с терминами таксономии. Как можно добавить ссылку под названием термина, которая будет фильтровать таблицу по этому термину? Я видел такую реализацию в нескольких плагинах.

@iamonstage Функция register_taxonomy()
теперь имеет встроенную поддержку этого через параметр show_admin_column
, передаваемый в аргументах. https://developer.wordpress.org/reference/functions/register_taxonomy/. Если вы не регистрируете таксономию самостоятельно, вы все равно можете изменить аргументы через фильтр register_taxonomy_args
https://developer.wordpress.org/reference/hooks/register_taxonomy_args/

Я написал функцию, которая объединяет фильтр manage_{$post_type}_posts_columns
и действие manage_{$post_type}_posts_custom_column
.
РЕДАКТИРОВАНО: Добавлен фильтр сортировки столбцов manage_edit-{$post_type}_sortable_columns
и действие pre_get_posts
.
function add_admin_column( $column_title, $post_type, $cb, $order_by = false, $order_by_field_is_meta = false ){
// Заголовок столбца
add_filter( 'manage_' . $post_type . '_posts_columns', function( $columns ) use ($column_title) {
$columns[ sanitize_title($column_title) ] = $column_title;
return $columns;
} );
// Содержимое столбца
add_action( 'manage_' . $post_type . '_posts_custom_column' , function( $column, $post_id ) use ($column_title, $cb) {
if( sanitize_title($column_title) === $column)
$cb($post_id);
}, 10, 2 );
// Указана сортировка?
if( !empty( $order_by ) ) {
// Сортировка столбца
add_filter( 'manage_edit-' . $post_type . '_sortable_columns', function ( $columns ) use ($column_title, $order_by) {
$columns[ sanitize_title($column_title) ] = $order_by;
return $columns;
} );
// Порядок столбца
add_action( 'pre_get_posts', function ( $query ) use ($order_by, $order_by_field_is_meta) {
if( ! is_admin() || ! $query->is_main_query() )
return;
if ( sanitize_key($order_by) === $query->get( 'orderby') ) {
if($order_by_field_is_meta){
$query->set( 'orderby', 'meta_value' );
$query->set( 'meta_key', sanitize_key($order_by) );
}
else {
$query->set( 'orderby', sanitize_key($order_by) );
}
}
} );
}
}
Использование:
add_admin_column(__('EAN'), 'product', function($post_id){
echo get_post_meta( $post_id , 'ean' , true );
}, 'meta_key_name', true);
Параметр meta_key_name
можно опустить, чтобы избежать сортировки. В противном случае вам нужно знать точное название meta_key для корректной работы сортировки.
add_admin_column(__('Последнее изменение'), 'post', function($post_id){
echo get_the_modified_date();
}, 'modified');
В этом случае modified
не является meta key.

Работает отлично, спасибо. Как сделать так, чтобы новая колонка стала сортируемой?

Попробуйте эту статью в Smashing Magazine https://www.smashingmagazine.com/2017/12/customizing-admin-columns-wordpress/

Это руководство сработало у меня. В моем случае я использую CPT UI для создания пользовательских типов записей, ACF для создания пользовательских полей записей и Code Snippets для связывания всего вместе.
Ниже я привел упрощенную версию кода.
Замените custom-post-type-slug
, custom_post_type_slug
и custom_column_name
ниже в соответствии с вашими потребностями. Убедитесь, что сохраняете тот же формат с тире/подчеркиванием при изменении имен.
Обратите внимание, что get_field()
специфичен для плагина ACF. Если вы не используете ACF, возможно, вам стоит использовать встроенную функцию WordPress get_post_meta()
для получения и отображения метаданных записи.
add_filter('manage_custom-post-type-slug_posts_columns', 'set_custom_edit_custom_post_type_slug_columns');
function set_custom_edit_custom_post_type_slug_columns($columns) {
$columns['custom_column_name'] = 'Название пользовательской колонки';
return $columns;
}
add_action('manage_custom-post-type-slug_posts_custom_column' , 'custom_custom_post_type_slug_column', 10, 2);
function custom_custom_post_type_slug_column($column, $post_id) {
switch ($column) {
case 'custom_column_name':
echo get_field('custom_column_name', $post_id);
break;
}
}
add_filter('manage_edit-custom-post-type-slug_sortable_columns', 'set_custom_custom_post_type_slug_sortable_columns');
function set_custom_custom_post_type_slug_sortable_columns($columns) {
$columns['custom_column_name'] = 'custom_column_name';
return $columns;
}
add_action('pre_get_posts', 'custom_post_type_slug_custom_orderby');
function custom_post_type_slug_custom_orderby($query) {
if ( ! is_admin()) {
return;
}
$orderby = $query->get('orderby');
if ('custom_column_name' == $orderby) {
$query->set('meta_key', 'custom_column_name');
$query->set('orderby', 'meta_value_num');
}
}

Я не уверен, являются ли метаданные по умолчанию тем, что вы хотите отображать в колонках, но вы можете рассмотреть этот бесплатный плагин, который позволяет добавлять колонки для отображения произвольных полей. https://wordpress.org/plugins/codepress-admin-columns/
Pro-версия даже позволяет добавить фильтрацию, сортировку и редактирование прямо в этих колонках.

НЕ ИСПОЛЬЗУЙТЕ! Это сломает ваш сайт: PHP Fatal error: Cannot redeclare AC() (previously declared in [redacted]\wp-content\themes\[redacted]\functions.php:628) in [redacted]\wp-content\plugins\codepress-admin-columns\api.php on line 9

@PeterKionga-Kamau это проблема совместимости с вашей конкретной темой. Ошибка, которую вы опубликовали, не появится с темой WordPress по умолчанию (например, twentytwenty); я также использую этот плагин с темой Divi и нахожу его весьма полезным

На основе ответа Карлоса (большое спасибо) Я хотел добавить маленькое изображение-миниатюру, но не основное, а из пользовательского метабокса.
Вот что я добавил:
add_admin_column(__('Миниатюра'), 'obraz', function($post_id){
$image_id = get_post_meta( $post_id , 'custom_thumbnail_metabox' , true );
echo '<img src="'.wp_get_attachment_image_url($image_id).'" />';
Информация: метаполе записи получает ID вложения/изображения, поэтому позже вызывается wp_get_attachment_image_url

Для заказов WooCommerce мне понадобилось использовать фильтр: manage_edit-shop_order_columns.
add_filter( 'manage_edit-shop_order_columns', 'manage_shop_order_posts_columns', 10, 1 );
function manage_shop_order_posts_columns($columns) {
$columns['test'] = 'Тест';
return $columns;
}
Затем для заполнения поля:
add_action( 'manage_shop_order_posts_custom_column' , 'manage_shop_order_custom_column', 10, 2 );
function manage_shop_order_custom_column($column, $post_id) {
switch ( $column )
{
case 'test' :
echo '1234';
break;
}
}
