Agregar botón en dashboard Pedidos de Woocommerce

Buen día a todos!
Tengo un desarrollo donde debo enviar los pedidos de Woocommerce a un desarrollo ERP desarrollado en .NET (hay un programador que hizo este ERP).
Lo que necesita es vincular Woocommerce con ese ERP para sincronizar pedidos, stock y otros.
Me consulta el programador si se puede agregar un botón en el área de pedidos, donde éste haga que se envíen los datos de ese pedido al ERP.
La idea es como se muestra en la siguiente imagen:

Por cada pedido, un botón que funcione como les comenté…

Dado que mi programación es muy limitada (diria nula), queria consultarles si hay alguna documentación para estos casos así orientar al programador como hacer esa vinculación.

Quedo a disposición y muchas gracias anticipadamente.
Muchas gracias
Saludos
Leonardo Grabow

Hola Leonardo, para agregar una columna adicional y un boton de accion tendrias que agregar algo por el estilo (visto de stackoverflow)

// Adding a custom comumn
add_filter('manage_edit-shop_order_columns', 'add_example_column');
function add_example_column($columns)
{
    $columns['erp'] = 'Enviar a ERP';
    return $columns;
}

// The column content by row
add_action('manage_shop_order_posts_custom_column', 'add_example_column_contents', 10, 2);
function add_example_column_contents($column, $post_id)
{
    if ('erp' === $column) {
        $order = wc_get_order($post_id); // Get the WC_Order instance Object

        // Targetting processing orders only
        if ($order->has_status('completed')) {
            $slug = 'erp';
            $url  = '?action=erp&order_id=' . $post_id; // The order Id is required in the URL

            // Output the button
            echo '<p><a class="button wc-action-button wc-action-button' . $slug . ' ' . $slug . '" href="' . $url . '" aria-label="' . $slug . '">Enviar a ERP</a></p>';
        }
    }
}

// The CSS styling
add_action('admin_head', 'add_custom_action_button_css');
function add_custom_action_button_css()
{
    $action_slug = "erp";

    echo '<style>.wc-action-button-' . $action_slug . '::after { font-family: woocommerce !important; content: "\e029" !important; }</style>';
}

Todo esto lo pegas en functions.php

En este caso toma si la orden es ‘completed’.

Lo que te faltaria en este caso es crear el procesamiento de esta accion, puede ser con ajax tal vez, ahi ya tendria que averiguar mas en los docs (aparte de como enviar los datos a traves de la API de ese ERP custom)

Espero que ayude

2 Me gusta

Lo hacés con los botones de acción:

function boton_accion_personalizado( $actions, $order ) {

if ( $order->has_status( array( 'processing' ) ) ) { //por ejemplo, que solo active para ese estado

    $action_slug = 'sinc_erp';

    $actions[$action_slug] = array(
        'url'       => 'url del endpoint del erp', ****IMPORTANTE, LEER ABAJO
        'name'      => __( 'Sincronizar al ERP', 'woocommerce' ),
        'action'    => $action_slug,
    );
}
return $actions;
}
add_filter( 'woocommerce_admin_order_actions', 'boton_accion_personalizado', 100, 2 );

Se que se puede estilizar directamente desde esa función, pero como aprovecho para meter varias reglas, uso:

function styling_admin_order_list() { 

    if (is_admin() && !empty($_GET['post_type']) && $_GET['post_type'] == 'shop_order'){

        ?>

            .wc-action-button-seguimiento::after {

                font-family: woocommerce !important;

                content: "\e019" !important;

            }

        </style>

        <?php

    }

}

add_action('admin_head', 'styling_admin_order_list' );

****IMPORTANTE, LEER ABAJO

Nunca probé de usar esos botones con url externa. Creo que no, pero cabe la posibilidad de que:
‘url’ => ‘url del endpoint del erp’
te agregue tu dominio adelante ( https://demobua.wnpower.host/https://urldelerp por ejemplo)

Si llegara a ser el caso, en vez de botón de acción, tenés que agregar una columna
Por ejemplo:

function columna_erp( $columns ) {

    $columns['erp'] = 'Sinc a ERP';

    return $columns;

}

add_filter( 'manage_edit-shop_order_columns', 'columna_erp' );

 

function columna_erp_contenido( $column ) {

    global $post;

 

    if ( 'erp' === $column ) {

echo 'sincronizar con ERP ';

    }

}

add_action( 'manage_shop_order_posts_custom_column', 'columna_erp_contenido' );
1 me gusta

Sí, es mejor usar los botones de acción para hacer la sincro manual, y en cuanto a la URL podes usar uno de ajax “’wp_nonce_url( admin_url( 'admin-ajax.php?action=cianbox_send_order&order_id=' . $order->get_id() ), 'wpnonce' )” y así armar tu funcion con tu sincro.

Pero si queres usar una sincro más automatizada, podes hacer ese envío exactamente cuando el cliente hace el pedido y ahi tenes miles de hooks que puedan ayudarte hasta el mismo hook de “gracias por su compra”.

Saludos

1 me gusta

Claro creo que es mejor la syncro automatica post cambio de estado de la orden. Y en el panel tal vez mostrar el estado (enviado o no al ERP) a modo informativo.

2 Me gusta

Justo después de responder quería meter ese tema, pero me entró laburo

Qué bodrio tener que clickear el botón de sincro con cada venta

Mejor usar

function sincro_erp($order, $data)
{
// usás este porque ya contás con order y data. Acciona justo antes de guardar la venta a la db
// modificás/agarrás lo que quieras mandar al erp
// curl al erp
}
Add_action(‘woocommerce_checkout_create_order’, ‘sincro_erp’,20,2};

Por último, si no tenés que modificar nada desde woo y podés parsear desde el erp, ni te gastes. Usá el webhook nativo de woo (woo>ajustes>¿integración?)

1 me gusta

Si tal cual no veo la necesidad de tener el boton, aparte ya tenes toda la data de la orden. Por aca es la cosa. :+1:

2 Me gusta

Hola Sebastian, he pegado el código tal cual indicaste a Binweb y me ha servido de mucho porque buscaba algo parecido. Me gustaría saber si sabes o podrías ayudarme a colocar el botón también una vez entre en los pedidos para de esa forma a través del botón enviar o llamar al mensajero/delivery. Te envío 3 capturas, la adaptación que hice a través de tu código (señalado en verde) y en las otras dos capturas en rojo donde me gustaría colocarlos.

Espero haberme explicadobien.
Muchas gracias por el aporte Sebastián.