Cambiar métodos de pago en WooCommerce programáticamente
Estoy intentando manipular programáticamente la selección del Método de Pago entre BACS y una opción de "No se requiere pago". Mi cliente quiere tener la capacidad de Solicitar Cotización solamente, así que he extendido acciones y filtros de WooCommerce, y proporcioné un método para solicitar cotización a través del sistema del carrito. Si el usuario ha solicitado solo una cotización, en la página de pago estoy intentando seleccionar automáticamente la opción de Pago contra entrega, que he renombrado a "Solicitar cotización solamente - No se requiere pago". Cualquier consejo sería de ayuda.

Existe un filtro llamado woocommerce_available_payment_gateways:
add_filter('woocommerce_available_payment_gateways','filter_gateways',1);
function filter_gateways($gateways){
global $woocommerce;
// Eliminar una opción de pago específica
unset($gateways['paypal']);
return $gateways;
}
No estoy seguro de dónde y cómo obtienes/almacenas la opción de Solicitud de Presupuesto, pero puedes acceder al valor dentro de la función filter_gateways y puedes eliminar una pasarela de pago específica con una lógica condicional.

He estado usando este filtro, sí, y funciona genial sin mi lógica condicional. Creo que el problema es que el valor que indica que es una Solicitud de Cotización se está pasando a través de variables de consulta. Lo que sucede es que, al principio, mostrará el valor de mi variable de consulta dentro de la función del filtro, pero luego las opciones de pago se recargan dinámicamente por lo que parece, posiblemente debido a las opciones de envío, y luego pierde mi variable de consulta. Al menos creo que voy por el camino correcto, pero incorporar mi lógica condicional en este filtro parece ser un poco una pesadilla

Mi problema aquí era usar variables de consulta para almacenar un valor que indique que la solicitud es solo para cotización. El área de pago se actualiza dinámicamente según los cambios dentro de las áreas de pago, y al cargar, los métodos de pago se recargan y los valores de las variables de consulta se pierden. Logré superar este problema utilizando las funciones WC()->session->set y WC()->session->get. He añadido las siguientes dos acciones para manipular el diseño basado en el valor de la sesión.
add_action("woocommerce_before_checkout_form", "custom_before_checkout_action");
function custom_before_checkout_action() {
if (isset($_GET["quote"]) && $_GET["quote"] == "1") {
echo '<h2>Solicitud de Cotización</h2>';
WC()->session->set("quote","true");
}
else {
WC()->session->set("quote","false");
echo '<h2>Comprar Muestra</h2>';
}
}
add_filter('woocommerce_available_payment_gateways','filter_gateways',1);
function filter_gateways($gateways){
if (WC()->session->get("quote") == "true")
unset($gateways['bacs']);
else
unset($gateways['cod']);
return $gateways;
}
Esto parece funcionar para preservar el valor y añadir lógica condicional incluso después de que se recargue el área de pago.
