WooCommerce Sipariş Özeti Tablosuna Özel Sütun Ekleme
E-ticaret sitelerinde sipariş yönetimi, her WooCommerce mağaza sahibinin günlük hayatının büyük bir parçası. WordPress admin panelinde WooCommerce > Siparişler ekranını açtığınızda gördüğünüz tablo, varsayılan olarak oldukça temel bilgiler sunar: sipariş numarası, müşteri adı, durum, tarih ve toplam tutar. Ama gerçek dünyada bu kadar bilgi çoğu zaman yetmez. Belki hangi kargo firmasına sipariş verildiğini, özel bir müşteri notunu ya da ödeme yöntemini direk tablodan görmek istiyorsunuz. İşte tam bu noktada WooCommerce’in hook sistemi devreye giriyor ve functions.php dosyasına birkaç satır kod ekleyerek sipariş tablosunu tamamen özelleştirebiliyorsunuz.
Bu yazıda WooCommerce sipariş listesi tablosuna nasıl özel sütun ekleyeceğinizi, bu sütunlara veri nasıl dolduracağınızı ve sütunları sıralanabilir hale nasıl getireceğinizi adım adım inceleyeceğiz. Gerçek dünya senaryolarıyla desteklenmiş kod örnekleriyle birlikte her şeyi functions.php üzerinden halledeceğiz.
WooCommerce Sipariş Tablosu Nasıl Çalışır?
WooCommerce, WordPress’in standart WP_List_Table sınıfını kullanır. Bu tablo yapısı, sütun eklemek ve kaldırmak için belirli filter ve action hook’ları sunar. Sipariş listesi için temel olarak iki ana hook kullanıyoruz:
manage_edit-shop_order_columns: Sütunları eklemek veya kaldırmak için kullanılan filter hookmanage_shop_order_posts_custom_column: Sütuna veri doldurmak için kullanılan action hook
WooCommerce 7.1 ve sonrasında HPOS (High-Performance Order Storage) özelliği geldi. Bu yeni sipariş depolama sistemi, farklı hook isimleri kullanıyor. Bu yüzden hem eski hem yeni sistemle uyumlu çalışan kod yazmak önemli. Yazı boyunca her iki sistemi de kapsayan örnekler göreceğiz.
Temel Sütun Ekleme: İlk Adım
En basit senaryodan başlayalım. Sipariş tablosuna ödeme yöntemi sütunu ekleyelim. Bu bilgi müşteri destek ekipleri için çok değerli, çünkü hangi müşterinin kredi kartı, hangisinin havale ile ödeme yaptığını anında görmek istiyorlar.
// functions.php dosyasına ekleyin
function custom_add_payment_method_column( $columns ) {
$new_columns = array();
foreach ( $columns as $column_name => $column_info ) {
$new_columns[ $column_name ] = $column_info;
// "Toplam" sütunundan önce ekle
if ( 'order_total' === $column_name ) {
$new_columns['payment_method'] = __( 'Ödeme Yöntemi', 'woocommerce' );
}
}
return $new_columns;
}
add_filter( 'manage_edit-shop_order_columns', 'custom_add_payment_method_column' );
// Sütuna veri doldur
function custom_populate_payment_method_column( $column ) {
global $post;
if ( 'payment_method' === $column ) {
$order = wc_get_order( $post->ID );
if ( $order ) {
$payment_method = $order->get_payment_method_title();
echo '<span class="payment-badge">' . esc_html( $payment_method ) . '</span>';
}
}
}
add_action( 'manage_shop_order_posts_custom_column', 'custom_populate_payment_method_column' );
Bu kodla artık sipariş tablonuzda ödeme yöntemi sütunu görünecek. Ama görsel olarak biraz daha çekici hale getirelim mi?
CSS ile Sütun Görünümünü İyileştirme
Admin paneline özel CSS eklemek için admin_head hook’unu kullanabilirsiniz. Ödeme yöntemlerine göre farklı renkler vermek, tabloyu taramayı kolaylaştırır.
function custom_order_columns_admin_css() {
$screen = get_current_screen();
if ( isset( $screen->id ) && 'edit-shop_order' === $screen->id ) {
echo '<style>
.column-payment_method { width: 120px; }
.payment-badge {
display: inline-block;
padding: 3px 8px;
border-radius: 3px;
font-size: 11px;
font-weight: 600;
background: #e8f4fd;
color: #2980b9;
}
.column-customer_note { width: 200px; }
.note-preview {
max-width: 180px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: block;
}
</style>';
}
}
add_action( 'admin_head', 'custom_order_columns_admin_css' );
Müşteri Telefon Numarası Sütunu Ekleme
Telefonla destek veren firmalar için en sık istenen özelliklerden biri bu. Müşteri listesine bakarken telefon numarasını görmek, sipariş detayına girme zahmetini ortadan kaldırır.
function custom_add_phone_column( $columns ) {
$reordered_columns = array();
foreach( $columns as $key => $column ) {
$reordered_columns[ $key ] = $column;
if( $key === 'billing_address' ) {
$reordered_columns['billing_phone'] = 'Telefon';
}
}
return $reordered_columns;
}
add_filter( 'manage_edit-shop_order_columns', 'custom_add_phone_column' );
function custom_populate_phone_column( $column ) {
global $post;
if ( 'billing_phone' === $column ) {
$order = wc_get_order( $post->ID );
if ( ! $order ) return;
$phone = $order->get_billing_phone();
if ( $phone ) {
// Telefonu tıklanabilir yap
printf(
'<a href="tel:%s" title="Ara">%s</a>',
esc_attr( $phone ),
esc_html( $phone )
);
} else {
echo '<span style="color: #999;">Belirtilmemiş</span>';
}
}
}
add_action( 'manage_shop_order_posts_custom_column', 'custom_populate_phone_column' );
Özel Meta Verilerini Sütun Olarak Gösterme
Pek çok mağazada siparişlere özel meta veriler eklenir. Örneğin, checkout sayfasına eklediğiniz “Teslimat Notu” veya “Fatura Adresi” gibi özel alanlar. Bu verileri sipariş tablosunda görüntülemek için şu yaklaşımı kullanabilirsiniz:
Diyelim ki checkout sayfanıza “Sipariş Notu” adlı özel bir alan eklediniz ve bunu _delivery_note meta anahtarıyla kaydediyorsunuz.
function custom_add_delivery_note_column( $columns ) {
// Mevcut sütunların sonuna ekle ama "actions" dan önce
$new_columns = array();
foreach ( $columns as $key => $value ) {
if ( 'wc_actions' === $key ) {
$new_columns['delivery_note'] = 'Teslimat Notu';
}
$new_columns[ $key ] = $value;
}
return $new_columns;
}
add_filter( 'manage_edit-shop_order_columns', 'custom_add_delivery_note_column' );
function custom_populate_delivery_note_column( $column ) {
global $post;
if ( 'delivery_note' !== $column ) return;
$order = wc_get_order( $post->ID );
if ( ! $order ) return;
// Hem sipariş meta'sından hem de müşteri notundan almayı dene
$note = $order->get_meta( '_delivery_note' );
if ( empty( $note ) ) {
// Alternatif olarak müşteri notuna bak
$note = $order->get_customer_note();
}
if ( ! empty( $note ) ) {
$short_note = strlen( $note ) > 50
? substr( $note, 0, 50 ) . '...'
: $note;
printf(
'<span class="note-preview" title="%s">%s</span>',
esc_attr( $note ),
esc_html( $short_note )
);
} else {
echo '<span style="color: #bbb;">-</span>';
}
}
add_action( 'manage_shop_order_posts_custom_column', 'custom_populate_delivery_note_column' );
HPOS ile Uyumlu Sütun Ekleme
WooCommerce 7.1+ ile birlikte gelen High-Performance Order Storage (HPOS) sistemi, siparişleri wp_posts yerine kendi tablolarında saklar. Bu durumda hook isimleri değişiyor. Her iki sistemi de desteklemek için aşağıdaki yaklaşımı kullanın:
function custom_is_hpos_enabled() {
if ( class_exists( 'AutomatticWooCommerceUtilitiesOrderUtil' ) ) {
return AutomatticWooCommerceUtilitiesOrderUtil::custom_orders_table_usage_is_enabled();
}
return false;
}
// Sütun ekleme - HPOS uyumlu
if ( custom_is_hpos_enabled() ) {
add_filter(
'manage_woocommerce_page_wc-orders_columns',
'custom_add_all_custom_columns'
);
add_action(
'manage_woocommerce_page_wc-orders_custom_column',
'custom_populate_all_columns',
10, 2
);
} else {
add_filter(
'manage_edit-shop_order_columns',
'custom_add_all_custom_columns'
);
add_action(
'manage_shop_order_posts_custom_column',
'custom_populate_all_columns',
10, 2
);
}
function custom_add_all_custom_columns( $columns ) {
$new_columns = array();
foreach ( $columns as $key => $label ) {
$new_columns[ $key ] = $label;
if ( 'order_status' === $key ) {
$new_columns['payment_method'] = 'Ödeme';
$new_columns['billing_phone'] = 'Telefon';
}
}
return $new_columns;
}
function custom_populate_all_columns( $column, $order_or_post_id = null ) {
// HPOS aktifse ikinci parametre order objesi, değilse post ID
if ( custom_is_hpos_enabled() && is_a( $order_or_post_id, 'WC_Order' ) ) {
$order = $order_or_post_id;
} else {
global $post;
$post_id = $order_or_post_id ? $order_or_post_id : $post->ID;
$order = wc_get_order( $post_id );
}
if ( ! $order ) return;
switch ( $column ) {
case 'payment_method':
echo esc_html( $order->get_payment_method_title() );
break;
case 'billing_phone':
$phone = $order->get_billing_phone();
echo $phone
? '<a href="tel:' . esc_attr( $phone ) . '">' . esc_html( $phone ) . '</a>'
: '-';
break;
}
}
Sütunu Sıralanabilir Yapma
Eklediğiniz sütuna göre siparişleri sıralamak isteyebilirsiniz. Örneğin ödeme yöntemine göre sıralama yapmak için ek bir hook ve query modifikasyonu gerekir.
// Sütunu sıralanabilir olarak kaydet
function custom_register_sortable_columns( $columns ) {
$columns['payment_method'] = 'payment_method';
return $columns;
}
add_filter(
'manage_edit-shop_order_sortable_columns',
'custom_register_sortable_columns'
);
// Sıralama sorgusu için meta_query düzenle
function custom_handle_custom_column_sorting( $query ) {
if ( ! is_admin() ) return;
$orderby = $query->get( 'orderby' );
if ( 'payment_method' === $orderby ) {
$query->set( 'meta_key', '_payment_method_title' );
$query->set( 'orderby', 'meta_value' );
}
}
add_action( 'pre_get_posts', 'custom_handle_custom_column_sorting' );
Kapsamlı Gerçek Dünya Örneği: Kargo Takip Sütunu
Şimdi daha karmaşık ama son derece kullanışlı bir senaryo. Bir kargo entegrasyon eklentisi kullandığınızı ve her siparişe _cargo_tracking_number ve _cargo_company meta verilerinin kaydedildiğini varsayalım. Bu bilgileri sipariş listesinde göstermek ve takip linkine tıklanabilir hale getirmek istiyorsunuz.
function custom_add_cargo_column( $columns ) {
$new_columns = array();
foreach ( $columns as $key => $label ) {
$new_columns[ $key ] = $label;
if ( 'order_date' === $key ) {
$new_columns['cargo_tracking'] = 'Kargo Takip';
}
}
return $new_columns;
}
add_filter( 'manage_edit-shop_order_columns', 'custom_add_cargo_column' );
function custom_populate_cargo_column( $column ) {
global $post;
if ( 'cargo_tracking' !== $column ) return;
$order = wc_get_order( $post->ID );
if ( ! $order ) return;
$tracking_no = $order->get_meta( '_cargo_tracking_number' );
$cargo_company = $order->get_meta( '_cargo_company' );
// Kargo firmalarına göre takip URL'leri
$tracking_urls = array(
'yurtici' => 'https://www.yurticikargo.com/tr/online-islemler/gonderi-sorgula?code=%s',
'aras' => 'https://kargotakip.araskargo.com.tr/?trackNo=%s',
'mng' => 'https://www.mngkargo.com.tr/gonderi-sorgulama?trackingNumber=%s',
'ptt' => 'https://gonderitakip.ptt.gov.tr/Track/Verify?q=%s',
'ups' => 'https://www.ups.com/track?tracknum=%s',
'fedex' => 'https://www.fedex.com/apps/fedextrack/?tracknumbers=%s',
);
if ( empty( $tracking_no ) ) {
// Kargo bilgisi henüz girilmemiş
$order_status = $order->get_status();
if ( in_array( $order_status, array( 'processing', 'completed' ) ) ) {
echo '<span style="color: #e67e22; font-size: 11px;">Bekleniyor</span>';
} else {
echo '<span style="color: #bbb;">-</span>';
}
return;
}
$cargo_key = strtolower( trim( $cargo_company ) );
if ( isset( $tracking_urls[ $cargo_key ] ) ) {
$url = sprintf( $tracking_urls[ $cargo_key ], urlencode( $tracking_no ) );
printf(
'<a href="%s" target="_blank" rel="noopener" title="%s - %s">
<span style="font-size: 11px; font-weight: 600;">%s</span><br>
<span style="font-size: 10px; color: #777;">%s</span>
</a>',
esc_url( $url ),
esc_attr( $cargo_company ),
esc_attr( $tracking_no ),
esc_html( strtoupper( $cargo_company ) ),
esc_html( $tracking_no )
);
} else {
printf(
'<span title="%s">%s<br><small style="color:#777;">%s</small></span>',
esc_attr( $cargo_company . ': ' . $tracking_no ),
esc_html( $cargo_company ),
esc_html( $tracking_no )
);
}
}
add_action( 'manage_shop_order_posts_custom_column', 'custom_populate_cargo_column' );
// Sütun genişliği ayarla
function custom_cargo_column_width() {
$screen = get_current_screen();
if ( isset( $screen->id ) && 'edit-shop_order' === $screen->id ) {
echo '<style>.column-cargo_tracking { width: 130px; }</style>';
}
}
add_action( 'admin_head', 'custom_cargo_column_width' );
Sütun Kaldırma: Gereksiz Olanları Temizleme
Bazen mevcut sütunlardan bazılarını kaldırmak gerekir. Örneğin fatura adresi sütununu kullanmıyorsanız ve ekran alanını verimli kullanmak istiyorsanız:
function custom_remove_unnecessary_columns( $columns ) {
// Kaldırmak istediğiniz sütunlar
$remove = array(
'billing_address', // Fatura adresi
'shipping_address', // Teslimat adresi
);
foreach ( $remove as $column ) {
unset( $columns[ $column ] );
}
return $columns;
}
// Bu filtreyi daha önce çalıştırdıysanız, üzerine ekleme yapabilirsiniz
// ya da add_all_custom_columns fonksiyonuna entegre edebilirsiniz
Sık Yapılan Hatalar ve Çözümleri
Bu kodları yazarken karşılaşılan bazı yaygın sorunlar ve çözümleri şöyle sıralayabiliriz:
- Sütun görünmüyor:
manage_edit-shop_order_columnsfilter hook ismini kontrol edin. HPOS aktifse farklı hook gerekir. - Veri görünmüyor:
manage_shop_order_posts_custom_columnaction’ında$columnile karşılaştırdığınız string, filter’da kullandığınız key ile birebir aynı olmalı. $postglobal değişkeni boş geliyor: HPOS aktif olduğunda$postyerine ikinci parametre kullanılır. HPOS uyumlu kod yazın.- PHP Notice hataları:
wc_get_order()null dönebilir, her zamanif ( $order )kontrolü yapın. - Sütun genişliği bozuk: CSS ile
.column-sütun_adısınıfı üzerinden genişlik verin. - Cache sorunu: Değişiklikleri göremiyorsanız tarayıcı önbelleğini ve varsa WordPress önbelleğini temizleyin.
- Filtre sırası önemli: Sütunları belirli bir yere eklemek istiyorsanız
foreachiçinde doğru anahtarı hedef alın.
Tüm Kodları Organize Etme
Büyük projelerde bu kodları functions.php içinde dağınık bırakmak yerine düzenli tutmak için bir sınıf yapısı veya en azından ayrı bir include dosyası kullanmak iyi pratiktir.
// functions.php içinde
if ( class_exists( 'WooCommerce' ) ) {
require_once get_stylesheet_directory() . '/inc/wc-order-columns.php';
}
// inc/wc-order-columns.php dosyası içeriği:
// Yukarıdaki tüm fonksiyonlarınız burada olsun
// Bu şekilde functions.php temiz kalır ve
// WooCommerce aktif değilse bu kodlar çalışmaz
Bu yaklaşımla hem functions.php dosyanız temiz kalır hem de WooCommerce aktif olmadığı durumlarda gereksiz kod çalışmaz.
Sonuç
WooCommerce sipariş tablosuna özel sütun eklemek, mağaza yönetimini ciddi ölçüde hızlandıran basit ama etkili bir özelleştirme. Müşteri hizmetleri ekibiniz artık her sipariş için detay sayfasına girmek zorunda kalmadan kritik bilgilere anında ulaşabilir. Telefon numarası, kargo takip kodu, ödeme yöntemi ya da özel bir meta alan, bunların hepsi birkaç satır functions.php koduyla tablo üzerinde görünür hale gelir.
Önemli nokta, HPOS uyumluluğu. WooCommerce geliştikçe yeni sipariş depolama sistemi standart hale geliyor. Bu yüzden yazdığınız kodları hem klasik hem HPOS sistemini destekleyecek şekilde yazarsanız ileride baş ağrısı yaşamazsınız. Kargo takip örneği gibi karmaşık senaryolarda null kontrollerini ve güvenlik fonksiyonlarını (esc_html, esc_attr, esc_url) atlamayın. Admin paneli de sonuçta bir kullanıcı arayüzü ve aynı güvenlik kuralları geçerli.
Kendi mağazanızın ihtiyaçlarına göre bu örnekleri adapte edin. Hangi bilgiyi hangi sütunda görüntülemek istediğinizi belirleyin, WooCommerce’in order API’sini kullanarak veriyi çekin ve tabloyu size özel bir yönetim paneline dönüştürün.
