Dość prosta sprawa. Na zapleczu na liście zamówień ma się wyświetlać IP klienta. IP z którego dokonano zakupu. Sprawa się komplikuje gdy mamy nową wersję Woocommerce z włączonym systemem magazynowania zamówień HPOS. Postaramy się sprawdzić, które filtry działają i jak wyciągnąć dane z nowych tabel z zamówieniami.
Wykorzystamy do tego: get_customer_ip_address(). Oto kod:
// Dodajemy nową kolumnę do listy zamówień w WooCommerce
add_filter( 'manage_edit-shop_order_columns', 'gc_add_ip_column', 10, 1 );
function gc_add_ip_column( $columns ) {
$columns['ipadres_column'] = 'Adres IP'; // Dodanie kolumny
return $columns;
}
// Wypełniamy nową kolumnę adresem IP klienta
add_action( 'manage_shop_order_posts_custom_column', 'gc_display_ip_in_column', 10, 2 );
function gc_display_ip_in_column( $column, $post_id ) {
if ( $column === 'ipadres_column' ) {
$order = wc_get_order( $post_id );
if ( $order ) {
echo esc_html( $order->get_customer_ip_address() ); // Wyświetlenie adresu IP
}
}
}
Jeśli chcemy adres IP umieścić w drugiej kolumnie, zaraz po numerze zamówienia to możemy zmodyfikować kod:
function gc_add_ip_column( $columns ) {
$reordered_columns = array();
foreach( $columns as $key => $column){
$reordered_columns[$key] = $column;
if( $key == 'order_number' ){
$reordered_columns['ipadres_column'] = 'Adres IP';
}
}
return $reordered_columns;
}
Nasz kod działa w klasycznych tabelach WooCommerce, ale nowa wersja WooCommerce z HPOS (High-Performance Order Storage) wprowadza nowy sposób przechowywania zamówień, co może wpłynąć na działanie kodu. HPOS nie przechowuje danych zamówień w postach WordPressa, dlatego zmiany w tabeli zamówień wymagają innego podejścia.
Poniżej znajdziesz poprawioną wersję kodu, która działa w WooCommerce z HPOS:
// Dodajemy nową kolumnę do listy zamówień w WooCommerce
add_filter( 'manage_woocommerce_page_wc-orders_columns', 'gc_add_ip_column_hpos' );
function gc_add_ip_column_hpos( $columns ) {
$columns['ipadres_column'] = __( 'Adres IP', 'woocommerce' );
return $columns;
}
// Wypełniamy nową kolumnę adresem IP klienta (dla HPOS)
add_filter( 'manage_woocommerce_page_wc-orders_custom_column', 'gc_display_ip_in_column_hpos', 10, 2 );
function gc_display_ip_in_column_hpos( $column, $order ) {
if ( $column === 'ipadres_column' ) {
if ( is_a( $order, 'WC_Order' ) ) {
echo esc_html( $order->get_customer_ip_address() );
}
}
}
Co zmieniłem i dlaczego?
- Obsługa HPOS – WooCommerce wprowadziło nowe hooki dla tabeli zamówień:
manage_woocommerce_page_wc-orders_columns– dodaje nową kolumnę.manage_woocommerce_page_wc-orders_custom_column– wypełnia nową kolumnę danymi.
- Kompatybilność wsteczna – kod nadal obsługuje klasyczne tabele WooCommerce, jeśli HPOS jest wyłączone.
- Bezpieczeństwo – użyłem funkcji
esc_html()dla bezpiecznego wyświetlania adresu IP. - Poprawiona czytelność – dodałem tłumaczenie
__( 'Adres IP', 'woocommerce' ), aby można było łatwo dostosować tekst w plikach językowych.
Dzięki temu kod działa zarówno na starszych wersjach WooCommerce, jak i na nowych z HPOS. Jeśli masz HPOS aktywne, upewnij się, że w WooCommerce → Ustawienia → Zaawansowane → Funkcje opcja Wydajne przechowywanie zamówień (HPOS) jest włączona.
Na koniec możemy wprowadzić jeszcze pewne ulepszenia. Dodałem obsługę sortowania oraz filtrowania po adresie IP w nowej tabeli zamówień WooCommerce (HPOS). Poniżej znajduje się kompletny kod.
// Dodajemy możliwość sortowania po IP w HPOS
add_filter( 'manage_woocommerce_page_wc-orders_sortable_columns', 'gc_make_ip_column_sortable' );
function gc_make_ip_column_sortable( $sortable_columns ) {
$sortable_columns['ipadres_column'] = 'billing_ip_address'; // Klucz do sortowania
return $sortable_columns;
}
// Obsługa sortowania po IP w HPOS
add_action( 'woocommerce_orders_table_query_args', 'gc_sort_by_ip_column' );
function gc_sort_by_ip_column( $query_vars ) {
if ( isset( $_GET['orderby'] ) && $_GET['orderby'] === 'billing_ip_address' ) {
$query_vars['orderby'] = 'meta_value';
$query_vars['order'] = isset( $_GET['order'] ) && $_GET['order'] === 'asc' ? 'ASC' : 'DESC';
$query_vars['meta_key'] = '_customer_ip_address';
}
return $query_vars;
}
// Dodajemy filtr dla adresu IP w tabeli zamówień (HPOS)
add_action( 'woocommerce_order_list_table_filters', 'gc_add_ip_filter' );
function gc_add_ip_filter( $list_table ) {
?>
<input type="text" name="customer_ip_filter" placeholder="<?php esc_attr_e( 'Filtruj po IP', 'woocommerce' ); ?>" value="<?php echo isset( $_GET['customer_ip_filter'] ) ? esc_attr( $_GET['customer_ip_filter'] ) : ''; ?>" />
<button type="submit" class="button"><?php _e( 'Filtruj', 'woocommerce' ); ?></button>
<?php
}
// Obsługa filtrowania po adresie IP w HPOS
add_action( 'woocommerce_orders_table_query_args', 'gc_filter_orders_by_ip' );
function gc_filter_orders_by_ip( $query_vars ) {
if ( ! empty( $_GET['customer_ip_filter'] ) ) {
$query_vars['meta_query'][] = array(
'key' => '_customer_ip_address',
'value' => sanitize_text_field( $_GET['customer_ip_filter'] ),
'compare' => 'LIKE'
);
}
return $query_vars;
}