Tengo algunas dificultades para obtener algo simple como el objeto de pedido en mi código. Así es como DEBE funcionar.
Pero por alguna razón, no obtengo el objeto de pedido (es NULL) de este filtro, así que creo que tengo que obtenerlo yo mismo. Pero aquí, estoy atascado :(
Lo estoy probando haciendo clic en "Recalcular sumas" en el pedido; luego debería eliminar o agregar los impuestos al pedido. Funciona cuando solo devuelvo verdadero en mi filtro, pero necesito algo más de lógica.
add_filter("woocommerce_order_is_vat_exempt", 'tax_exempted_user'); function tax_exempted_user(){ global $order; // returns NULL $user = $order->get_user(); if( $user->get_id() && get_field( 'field_60dd7434e8426', 'user_' . $user->get_id() ) == true ) { return true; } else { return false; } }No hay ningún objeto de pedido global en WooCommerce en este momento. Si revisa el código de WooCommerce donde se aplica el gancho, ¡habrá visto esto sin perder su tiempo haciendo una pregunta que puede responder usted mismo!
wp-content/plugins/woocommerce/includes/abstracts/abstract-wc-order.php | línea 1562
$is_vat_exempt = apply_filters( 'woocommerce_order_is_vat_exempt', 'yes' === $this->get_meta( 'is_vat_exempt' ), $this ); Dado que la clase definida en este archivo es una clase abstracta de un pedido, $this es su $order ya que hace referencia al objeto/clase.
Como recomendación, le sugiero que revise los filtros y enlaces en la documentación del desarrollador de WordPress. Normalmente encuentras muchas respuestas allí:
https://developer.wordpress.org/reference/functions/add_filter/https://developer.wordpress.org/reference/functions/add_action/
Además, puede buscar dónde se aplican los ganchos en su IDE con el conocimiento de los enlaces de documentación anteriores en el futuro.
Entonces, en su lugar, su código debe cambiarse a esto:
add_filter( 'woocommerce_order_is_vat_exempt', 'filter_woocommerce_order_is_vat_exempt', 10, 2 ); function filter_woocommerce_order_is_vat_exempt( bool $is_exempt, WC_Order $order ) { $user = $order->get_user(); error_log( $order->get_id() ); // <-- Check error log for the id of an order - this way you can be sure its working if ( $user->get_id() && get_field( 'field_60dd7434e8426', 'user_' . $user->get_id() ) == true ) { return true; } else { return false; } } Puede eliminar la función error_log() nuevamente cuando esté seguro de que todo funciona. Si no sabe cómo habilitar o usar el inicio de sesión en WordPress durante su desarrollo, puede consultar esta fuente:
https://wordpress.org/support/article/debugging-in-wordpress/