Adăugarea coloanelor personalizate pentru tipuri de postări personalizate

23 ian. 2017, 18:12:58
Vizualizări: 124K
Voturi: 63

Am făcut asta anterior, dar am uitat numele hook-ului și nu-l pot găsi nicăieri...

Ceea ce încerc să fac este să adaug niște coloane personalizate în listarea unui tip de postare personalizat în panoul de administrare.

De exemplu, în admin, când fac click pe articole, vreau să adaug o coloană personalizată acolo.

1
Comentarii

am pus (și am răspuns) la aceeași întrebare (inclusiv cum să le faci sortabile): http://wordpress.stackexchange.com/questions/253680/add-custom-column-to-custom-post-type-overview-in-backend

beta beta
23 ian. 2017 23:51:16
Toate răspunsurile la întrebare 6
5
140

Hook-urile pentru a crea coloane personalizate și datele asociate pentru un tip de postare personalizat sunt manage_{$post_type}_posts_columns și manage_{$post_type}_posts_custom_column respectiv, unde {$post_type} reprezintă numele tipului de postare personalizat.

Acest exemplu din documentație elimină coloana autor și adaugă o coloană pentru taxonomie și metadate:

// Adaugă coloanele personalizate la tipul de postare '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'] = __( 'Autor', 'your_text_domain' );
    $columns['publisher'] = __( 'Editor', 'your_text_domain' );

    return $columns;
}

// Adaugă datele în coloanele personalizate pentru tipul de postare '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( 'Nu s-au putut obține autor(i)', 'your_text_domain' );
            break;

        case 'publisher' :
            echo get_post_meta( $post_id , 'publisher' , true ); 
            break;

    }
}
23 ian. 2017 18:27:37
Comentarii

Mulțumesc pentru acest hook!!! Este genial!!! Nu există documentație clară pe stackoverflow!!! :D Noroc prietene

Rodrigo Zuluaga Rodrigo Zuluaga
30 mai 2019 05:12:56

nu există nicio opțiune de a seta numărul coloanei? cum ar fi column_index[2]. Deoarece custom_column apare la sfârșitul coloanei.

Dilip Gupta Dilip Gupta
21 iun. 2019 11:52:19

@DilipGupta $columns este un array, îl poți reordona înainte să-l returnezi

fogx fogx
16 iul. 2019 13:39:37

În cazul adăugării unei coloane pentru termenii de taxonomie. Cum ai putea adăuga un link sub numele termenului care să filtreze tabelul după acel termen? Am văzut acest lucru în câteva plugin-uri anterioare.

iamonstage iamonstage
14 mar. 2021 17:01:54

@iamonstage register_taxonomy() acum are suport integrat pentru această funcționalitate prin setarea show_admin_column transmisă prin argumente. https://developer.wordpress.org/reference/functions/register_taxonomy/. Dacă nu înregistrezi tu taxonomia, poți totuși modifica argumentele prin filtrul register_taxonomy_args https://developer.wordpress.org/reference/hooks/register_taxonomy_args/

Dave Romsey Dave Romsey
15 mar. 2021 08:05:31
3
17

Am scris o funcție care combină filtrul manage_{$post_type}_posts_columns și acțiunea manage_{$post_type}_posts_custom_column.

EDIT: Am adăugat filtrul de sortare a coloanelor manage_edit-{$post_type}_sortable_columns și acțiunea pre_get_posts.

function add_admin_column( $column_title, $post_type, $cb, $order_by = false, $order_by_field_is_meta = false ){

    // Antetul coloanei
    add_filter( 'manage_' . $post_type . '_posts_columns', function( $columns ) use ($column_title) {
        $columns[ sanitize_title($column_title) ] = $column_title;
        return $columns;
    } );

    // Conținutul coloanei
    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 );

    // Este setat OrderBy?
    if( !empty( $order_by ) ) {

      // Sortarea coloanei
      add_filter( 'manage_edit-' . $post_type . '_sortable_columns', function ( $columns ) use ($column_title, $order_by) {
          $columns[ sanitize_title($column_title) ] = $order_by;
          return $columns;
      } );

      // Ordonarea coloanei
      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) );
              }
          }
      } );
  
    }

}

Utilizare:

add_admin_column(__('EAN'), 'product', function($post_id){
    echo get_post_meta( $post_id , 'ean' , true ); 
}, 'meta_key_name', true);

meta_key_name poate fi omis pentru a evita sortarea. Altfel, va trebui să cunoașteți numele exact al meta_key pentru ca sortarea să funcționeze corect.

add_admin_column(__('Ultima modificare'), 'post', function($post_id){
    echo get_the_modified_date(); 
}, 'modified');

În acest caz, modified nu este un meta key.

10 dec. 2020 21:05:34
Comentarii

Funcționează perfect, mulțumesc. Cum pot face ca noua coloană să fie sortabilă?

André R. Kohl André R. Kohl
7 ian. 2021 13:02:40

Încearcă acest articol de pe Smashing Magazine https://www.smashingmagazine.com/2017/12/customizing-admin-columns-wordpress/

Carlos Santos Carlos Santos
3 mar. 2021 19:45:24

Făcând aceste lucruri descoperi adevărata PUTERE a WordPress... Mulțumesc!

gtamborero gtamborero
21 ian. 2023 19:33:12
1

Acest ghid a funcționat pentru mine. În cazul meu, folosesc CPT UI pentru a crea tipurile personalizate de postări, ACF pentru a crea câmpurile personalizate ale postărilor și Code Snippets pentru a lega totul împreună.

Am inclus mai jos o versiune simplificată a codului.

Modifică custom-post-type-slug, custom_post_type_slug și custom_column_name mai jos pentru a se potrivi nevoilor tale. Asigură-te că păstrezi același format cu liniuțe/underscore atunci când schimbi numele.

Reține că get_field() este specific pluginului ACF. Dacă nu folosești ACF, poți dori să utilizezi funcția încorporată din WordPress get_post_meta() pentru a prelua și afișa metadatele postării.

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'] = 'Titlu Coloană Personalizată';
    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 ian. 2022 23:53:08
Comentarii

Mulțumesc pentru acest răspuns, pe care l-am găsit foarte util. În ultima linie a codului tău "$query->set('orderby', 'meta_value_num');" ce înseamnă meta_value_num?

stvwlf stvwlf
10 sept. 2024 23:44:07
3

Nu sunt sigur dacă meta datele personalizate implicite sunt ceea ce doriți să afișați ca coloane, dar ați putea lua în considerare utilizarea acestui plugin gratuit care vă permite să adăugați coloane pentru a afișa câmpuri personalizate. https://wordpress.org/plugins/codepress-admin-columns/

Versiunea pro vă permite chiar să adăugați filtrare, sortare și editare inline pentru aceste coloane.

23 ian. 2017 21:12:50
Comentarii

NU FOLOSIȚI! Va strica site-ul: PHP Fatal error: Nu se poate redeclara AC() (declarată anterior în [redacted]\wp-content\themes\[redacted]\functions.php:628) în [redacted]\wp-content\plugins\codepress-admin-columns\api.php la linia 9

Peter Kionga-Kamau Peter Kionga-Kamau
6 nov. 2018 22:17:07

@PeterKionga-Kamau aceasta este o problemă de compatibilitate cu tema ta specifică. Eroarea afișată nu va apărea cu o temă WP implicită (cum ar fi twentytwenty); eu folosesc acest plugin cu tema Divi și îl consider foarte util

Philipp Philipp
8 oct. 2019 22:34:19

Nu există vreun fel de namespacing sau utilizare de nume de funcții mai puțin generice care ar putea evita acest lucru?

Peter Kionga-Kamau Peter Kionga-Kamau
9 oct. 2019 23:06:12
0

Pe baza răspunsului lui Carlos (mulțumesc mult) Am vrut să adaug o mică imagine thumbnail, dar nu una featured, ci una dintr-un metabox personalizat.

Deci iată ce am adăugat:

add_admin_column(__('Thumbnail'), '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).'" />';

Informații: post meta va obține ID-ul atașamentului/imaginii, de aceea mai târziu se apelează wp_get_attachment_image_url

21 mar. 2021 19:47:22
0

Pentru comenzile WooCommerce, am avut nevoie să folosesc filtrul: 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'] = 'Test';
    return $columns;
}

Apoi, pentru a popula câmpul:

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 nov. 2021 05:36:01