Agregue un campo personalizado a los artículos de pedido de WooCommerce

4 minutos de lectura

Actualmente, los artículos de pedido de WooCommerce dentro de un pedido tienen las siguientes columnas:

  • Artículo
  • Clase de impuestos
  • Cantidad
  • Totales
  • Impuesto

Ver captura de pantalla

Lo que pretendo hacer es agregar una columna adicional (o meta) que tenga un campo desplegable para Estado del producto.

¿Alguien tiene alguna idea sobre cómo podría lograr esto?

avatar de usuario
Pablo Dowlin

En caso de que alguien más se tropiece con esto, necesitaba agregar algunos metadatos de pedidos personalizados al cuadro de metadatos de artículos de pedido en la pantalla de edición de pedidos. En 2017 así resolví este dilema.

El archivo class-wc-meta-box-order-items.phpencontrado bajo includes/admin/meta-boxes ha cambiado ligeramente desde 2014 pero incluye el archivo de plantilla html-order-items.php.

Es en ese último archivo donde encontrarás dos ganchos sin documentar, woocommerce_admin_order_item_headersque usaría para agregar su texto de encabezado de columna personalizado y tiene acceso al objeto $order y woocommerce_admin_order_item_valuesque coloca su contenido personalizado justo antes de la columna Costo y tiene acceso a $product, $item y $item_id.

Entonces, para agregar una columna personalizada, se vería así.

add_action( 'woocommerce_admin_order_item_headers', 'pd_admin_order_items_headers' );
function pd_admin_order_items_headers($order){
  ?>
  <th class="line_customtitle sortable" data-sort="your-sort-option">
    Custom Title
  </th>
  <?php
}

donde su opción de clasificación depende de los datos que desee clasificar. Usé cuerdas en mi situación.

Que por el contenido de cada elemento de línea que tendría.

add_action( 'woocommerce_admin_order_item_values', 'pd_admin_order_item_values' );
function pd_admin_order_item_values( $product, $item, $item_id ) {
  //Get what you need from $product, $item or $item_id
  ?>
  <td class="line_customtitle">
    <?php //your content here ?>
  </td>
  <?php
}

Hay algunos otros ganchos y filtros en ese archivo de plantilla que definitivamente vale la pena mirar si necesita contenido en diferentes lugares dentro de ese meta-box.

  • Paul Dowlin: ¡Muy útil! Solo quiero señalar que el primer parámetro add_action debe ser ‘woocommerce_admin_order_item_headers’ (no artículos).

    – DougP

    25 de enero de 2017 a las 7:20

  • @DougP ¡Buena captura! Actualicé mi respuesta.

    –Paul Dowlin

    1 de febrero de 2017 a las 5:48

  • deberías asegurarte de que add_action tiene los parámetros correctos establecidos. Para que esto funcione correctamente debe ser: add_action( 'woocommerce_admin_order_item_values', 'pd_admin_order_item_values', 10, 3 );

    – Cornel Raiú

    14 de marzo de 2019 a las 4:19


También estoy en medio de algunos ajustes importantes en esta tabla, y aún no lo he resuelto todo, pero sé mucho, si revisa el class-wc-meta-box-order-items.php dentro del directorio de complementos, encontrará este fragmento de código:

// List order items
$order_items = $order->get_items( apply_filters( 'woocommerce_admin_order_item_types',  array( 'line_item', 'fee' ) ) );

foreach ( $order_items as $item_id => $item ) {

switch ( $item['type'] ) {
    case 'line_item' :
        $_product   = $order->get_product_from_item( $item );
        $item_meta  = $order->get_item_meta( $item_id );

        include( 'views/html-order-item.php' );
    break;
    case 'fee' :
        include( 'views/html-order-fee.php' );
    break;
}

do_action( 'woocommerce_order_item_' . $item['type'] . '_html', $item_id, $item );
}

¡¡¡NO EDITES ESTE FRAGUMENTO!!!

Desde aquí puede comenzar a ver lo que compone esa tabla. Creo (por lo que sé de WooCommerce hasta ahora) que puedes crear una función que se conecte al filtro allí: woocommerce_admin_order_item_types();

Eso es lo que yo haría algo como esto:

# Admin Panel Updates
add_filter( 'woocommerce_add_order_item_meta', array( $this, 'display_order_item_meta' ), 10, 2 );
public function display_order_item_meta( $order_items ) {
    array_push($order_items,'event'); //Not sure how to manipulate this yet
    return $order_items;
}

También parece que tendríamos que hacer algo con el gancho de acción (woocommerce_order_item_' . $item['type'] . '_html', $item_id, $item), tal vez algo en este sentido:

add_filter( 'woocommerce_order_item_event_html', array( $this, 'display_event_item_meta' ), 10, 2 );

public function display_event_item_meta( $item_id, $item) {
    switch ( $item['type'] ) {
        case 'event' :
        include( 'views/html-order-event-item.php' );
            break;
    }
}

Esa es mi mejor suposición hasta ahora, pero estoy seguro de que este es el fragmento de código correcto para diseccionar.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad