Добавление пользовательских колонок в произвольные типы записей

23 янв. 2017 г., 18:12:58
Просмотры: 124K
Голосов: 63

Я делал это раньше, но забыл название хука и не могу нигде его найти...

Я пытаюсь добавить несколько пользовательских колонок в список произвольного типа записей в админ-панели.

Например, в админке, при клике на статьи, я хочу добавить туда пользовательскую колонку.

1
Комментарии

я задал (и ответил) на тот же вопрос (включая то, как сделать их сортируемыми): http://wordpress.stackexchange.com/questions/253680/add-custom-column-to-custom-post-type-overview-in-backend

beta beta
23 янв. 2017 г. 23:51:16
Все ответы на вопрос 6
5
140

Хуки для создания пользовательских колонок и связанных с ними данных для произвольного типа записи — это 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;

    }
}
23 янв. 2017 г. 18:27:37
Комментарии

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

Rodrigo Zuluaga Rodrigo Zuluaga
30 мая 2019 г. 05:12:56

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

Dilip Gupta Dilip Gupta
21 июн. 2019 г. 11:52:19

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

fogx fogx
16 июл. 2019 г. 13:39:37

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

iamonstage iamonstage
14 мар. 2021 г. 17:01:54

@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/

Dave Romsey Dave Romsey
15 мар. 2021 г. 08:05:31
3
17

Я написал функцию, которая объединяет фильтр 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.

10 дек. 2020 г. 21:05:34
Комментарии

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

André R. Kohl André R. Kohl
7 янв. 2021 г. 13:02:40

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

Carlos Santos Carlos Santos
3 мар. 2021 г. 19:45:24

Именно в таких вещах проявляется МОЩЬ WordPress... Спасибо!

gtamborero gtamborero
21 янв. 2023 г. 19:33:12
1

Это руководство сработало у меня. В моем случае я использую 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');
    }
}
24 янв. 2022 г. 23:53:08
Комментарии

Спасибо, это было очень полезно. В последней строке вашего кода "$query->set('orderby', 'meta_value_num');" что означает meta_value_num?

stvwlf stvwlf
10 сент. 2024 г. 23:44:07
3

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

Pro-версия даже позволяет добавить фильтрацию, сортировку и редактирование прямо в этих колонках.

23 янв. 2017 г. 21:12:50
Комментарии

НЕ ИСПОЛЬЗУЙТЕ! Это сломает ваш сайт: 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

Peter Kionga-Kamau Peter Kionga-Kamau
6 нояб. 2018 г. 22:17:07

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

Philipp Philipp
8 окт. 2019 г. 22:34:19

Разве нельзя использовать пространства имен или менее универсальные имена функций, чтобы избежать этого?

Peter Kionga-Kamau Peter Kionga-Kamau
9 окт. 2019 г. 23:06:12
0

На основе ответа Карлоса (большое спасибо) Я хотел добавить маленькое изображение-миниатюру, но не основное, а из пользовательского метабокса.

Вот что я добавил:

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

21 мар. 2021 г. 19:47:22
0

Для заказов 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;
    }
}
8 нояб. 2021 г. 05:36:01