Agregue una columna personalizada con metadatos a la tabla de pedidos de mi cuenta en Woocommerce 3+

3 minutos de lectura

Avatar de usuario de Dimas Anugerah
Dimas Anugerah

Woocommerce 3.5.x tiene una página especial en el área de la cuenta de usuario (Mi cuenta) donde muestra los pedidos anteriores del usuario.

Esta página ahora muestra 5 columnas de forma predeterminada.

Aquí la captura de pantalla del área de Pedidos de woocommerce con 5 columnas:

Mis ordenes

No puedo encontrar la manera de cambiar esto.

¿Cómo puedo agregar una nueva columna en el valor predeterminado?

Avatar de usuario de LoicTheAztec
LoicTheAztec

Esto requiere 2 funciones que agregarán una nueva columna

El segundo gancho de función es un gancho compuesto: woocommerce_my_account_my_orders_column_{$column_id} dónde {$column_id} debe ser reemplazado por el slug de clave de columna que se establece en la primera función.

Esa segunda función administra los valores de fila mostrados y puede agregar, por ejemplo, un campo personalizado para obtener valores de metadatos de pedidos personalizados.

El código:

add_filter( 'woocommerce_account_orders_columns', 'add_account_orders_column', 10, 1 );
function add_account_orders_column( $columns ){
    $columns['custom-column'] = __( 'New Column', 'woocommerce' );

    return $columns;
}

add_action( 'woocommerce_my_account_my_orders_column_custom-column', 'add_account_orders_column_rows' );
function add_account_orders_column_rows( $order ) {
    // Example with a custom field
    if ( $value = $order->get_meta( '_custom_field' ) ) {
        echo esc_html( $value );
    }
}

El código va en el archivo function.php de su tema secundario activo (o tema activo). Probado y funciona.


Ha terminado y ha agregado una columna personalizada a la tabla de pedidos de Mi cuenta:

ingrese la descripción de la imagen aquí

Si desea realizar cambios en la salida html de la tabla, deberá anular el archivo de plantilla: myaccount/orders.php

Si no desea cambiar la plantilla de pedido en la página de mi cuenta. Esto es lo que tienes que hacer.

Primero:

function wc_add_myaccount_order_column( $columns ) {
    $columns[ 'custom-column' ] = __( 'Custom Column', 'woocommerce' );
}
add_filter( 'woocommerce_my_account_my_orders_columns', 'wc_add_myaccount_order_column' );

Segundo:

function wc_custom_column_display( $order ) {
    // do something here
    echo "testing";
}
add_action( 'woocommerce_my_account_my_orders_column_custom-column', 'wc_custom_column_display' );

El código de arriba se mostrará “pruebas” en cada orden bajo “Columna personalizada” columna.

Nota: si realmente desea cambiar la plantilla completa, como el diseño, por ejemplo. Puedes seguir la primera respuesta anterior.

Solo para mejorar la respuesta aceptada, agrego una línea para elegir la posición de la columna (después del total):

function sv_wc_add_my_account_orders_column( $columns ) {

    $new_columns = array();

    foreach ( $columns as $key => $name ) {

        $new_columns[ $key ] = $name;

        // add ship-to after order status column
        if ( 'order-total' === $key ) {  //this is the line!
            $new_columns['custom-column'] = __( 'Custom Column', 'woocommerce' );
        }
    }

    return $new_columns;
}
add_filter( 'woocommerce_my_account_my_orders_columns', 'sv_wc_add_my_account_orders_column' );


    function wc_custom_column_display( $order ) {
        // do something here
        echo "testing";
    }
    add_action( 'woocommerce_my_account_my_orders_column_custom-column', 'wc_custom_column_display' );

Con WooCommerce 5.9, no pude hacer funcionar la respuesta de LiocTheAztect. Lo que funcionó para mí fue:

add_filter( 'woocommerce_account_orders_columns', 
'add_customer_email_column');
    function add_customer_email_column( $columns ){
        $new_columns = [
        "order-number" => $columns["order-number"],
        // ...
        "customer-email" => __( 'Customer Email', '' ),
        // ...
        "order-actions" => $columns["order-actions"]
    ];
    return $new_columns;
}

add_action( 'woocommerce_my_account_my_orders_column_customer-email', 
'add_customer_email_content' );
    function add_customer_email_content($order) {
    echo esc_html($order->get_billing_email());
}

Sin el if ($value = $order->get_meta( '_custom_field' )) bloquear. Espero eso ayude.

¿Ha sido útil esta solución?