Adăugarea coloanelor personalizate pentru tipuri de postări personalizate
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.
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;
}
}

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

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.

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

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

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.

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

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

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');
}
}

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.

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

@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

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

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;
}
}
