php - Action button in WooCommerce admin orders list that send the customer invoice
Get the solution ↓↓↓in Wordpress admin dashboard, when you open woocommerce order page, you will see list of the orders and the columns are (Order, Date, Status, Billing, Shipping, Total, Actions)
I would like to add a new button for Action list and then add this action to send the Email Invoice to the customers which orders are still on-hold.
I have created the column and the button as below, but I have trouble with calling the action button to send the invoice to the customers for each order.
please advice.
add_filter( 'woocommerce_admin_order_actions', 'add_custom_order_status_actions_button', 100, 2 );
function add_custom_order_status_actions_button( $actions, $order ) {
if ( $order->has_status( array( 'on-hold' ) ) ) {
// The key slug defined for your action button
$action_slug = 'invoice';
$status = $_GET['status'];
$order_id = method_exists($the_order, 'get_id') ? $the_order->get_id() : $the_order->id;
// Set the action button
$actions[$action_slug] = array(
'url' => admin_url('post.php?post=' . $post_id . '&action=edit&message=11'),
'name' => __( 'Invoice', 'woocommerce' ),
'action' => $action_slug,
);
}
return $actions;
}
add_action( 'admin_head', 'add_custom_order_status_actions_button_css' );
function add_custom_order_status_actions_button_css() {
$action_slug = "invoice"; // The key slug defined for your action button
echo '<style>.wc-action-button-'.$action_slug.'::after { font-family: woocommerce !important; content: "\e029" !important; }</style>';
}
Answer
Solution:
Updated (added missing'
).
The following will add on admin orders list actions column an action button for orders with an "on hold" status. The button send the customer invoice notification via admin Ajax.
The complete code:
add_filter( 'woocommerce_admin_order_actions', 'add_admin_order_custom_actions_button', 100, 2 );
function add_admin_order_custom_actions_button( $actions, $order ) {
if ( $order->has_status( array( 'on-hold' ) ) ) {
// The key slug defined for your action button
$action_slug = 'email_invoice';
// Set the action button
$actions[$action_slug] = array(
'url' => wp_nonce_url(
admin_url('admin-ajax.php?action=send_invoice_email&order_id=' . $order->get_id() ),
'send-invoice-email'
),
'name' => __( 'Send Invoice', 'woocommerce' ),
'action' => $action_slug,
);
}
return $actions;
}
add_action( 'wp_ajax_send_invoice_email', 'trigger_customer_email_invoice' );
function trigger_customer_email_invoice() {
if ( current_user_can('edit_shop_orders') && check_admin_referer('send-invoice-email') &&
isset($_GET['order_id']) && get_post_type( absint( wp_unslash($_GET['order_id']) ) ) === 'shop_order' ) {
$order_id = absint( wp_unslash($_GET['order_id']) );
WC()->mailer()->get_emails()['WC_Email_Customer_Invoice']->trigger($order_id); // Send email
update_post_meta( $order_id, '_invoice_sent', 'OK' ); // For testing purpose (to be removed)
}
}
add_action( 'admin_head', 'add_custom_order_status_actions_button_css' );
function add_custom_order_status_actions_button_css() {
$action_slug = "email_invoice"; // The key slug defined for your action button
echo '<style>.wc-action-button-'.$action_slug.'::after { font-family: woocommerce !important; content: "\e02d" !important; }</style>';
}
Code goes in functions.php file of the active child theme (or active theme). Tested and works.
Share solution ↓
Additional Information:
Link To Answer People are also looking for solutions of the problem: constant expression contains invalid operations
Didn't find the answer?
Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.
Similar questions
Find the answer in similar questions on our website.
Write quick answer
Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.