Mejoras WooCommerce

Como completar pedidos automáticamente (para que salten automatizaciones como AutomatorWP), poder editar pedidos y añadir un nuevo estado de pedido como «Enviado».

// Completar pedidos automáticamente woocommerce
function fla_actualiza_estado_pedidos_a_completado($order_id)
{
	global $woocommerce;

	//ID's de las pasarelas de pago a las que afecta
	$paymentMethods = array('stripe', 'paypal', 'ppcp-gateway');

	if (!$order_id) return;
	$order = new WC_Order($order_id);

	if (!in_array($order->payment_method, $paymentMethods)) return;
	$order->update_status('completed');
}
add_action('woocommerce_order_status_processing', 'fla_actualiza_estado_pedidos_a_completado', 5);

// Editar Pedidos woocommerce
function bbloomer_custom_order_status_editable( $allow_edit, $order ) {
	if ( $order->get_status() === 'completed' ) {
		$allow_edit = true;
	}
	return $allow_edit;
}
add_filter( 'wc_order_is_editable', 'bbloomer_custom_order_status_editable', 9999, 2 );

// Añadir estado de pedido "Enviado"
function register_enviado_order_status() {
	register_post_status( 'wc-enviado', array(
		'label' => 'Enviado',
		'public' => true,
		'show_in_admin_status_list' => true,
		'show_in_admin_all_list' => true,
		'exclude_from_search' => false,
		'label_count' => _n_noop( 'Enviado <span class="count">(%s)</span>', 'Enviado <span class="count">(%s)</span>' )
	) );
}
add_action( 'init', 'register_enviado_order_status' );
function add_enviado_to_order_statuses( $order_statuses ) {
	$new_order_statuses = array();
	foreach ( $order_statuses as $key => $status ) {
		$new_order_statuses[ $key ] = $status;
		if ( 'wc-processing' === $key ) {
			$new_order_statuses['wc-enviado'] = 'Enviado';
		}
	}
	return $new_order_statuses;
}
add_filter( 'wc_order_statuses', 'add_enviado_to_order_statuses' );
function add_enviado_bulk_actions( $bulk_actions ) {
	$bulk_actions['mark_enviado'] = 'Cambiar a Enviado';
	return $bulk_actions;
}
add_filter( 'bulk_actions-edit-shop_order', 'add_enviado_bulk_actions', 20, 1 );

function handle_enviado_bulk_actions( $redirect_to, $action, $post_ids ) {
	if ( $action !== 'mark_enviado' ) {
		return $redirect_to;
	}
	foreach ( $post_ids as $post_id ) {
		$order = wc_get_order( $post_id );
		$order->update_status( 'enviado' );
	}
	$redirect_to = add_query_arg( 'bulk_enviado_orders', count( $post_ids ), $redirect_to );
	return $redirect_to;
}
add_filter( 'handle_bulk_actions-edit-shop_order', 'handle_enviado_bulk_actions', 10, 3 );
function enviado_status_label_color( $order ) {
	?>
	<style>
        mark.order-status.status-enviado.tips {
            background-color: cornflowerblue;
            color: white;
        }
	</style>
	<?php
}
add_action( 'admin_head', 'enviado_status_label_color' );