Estoy creando un complemento personalizado para una página impulsada por WordPress para deshabilitar un botón determinado bajo condición.
Contexto: para deshabilitar el botón de realizar pedido si el usuario incumplió un límite de crédito determinado.
Espero que al ingresar a la página de pago, el complemento se active y verifique si el usuario excedió el límite de crédito. En caso afirmativo, alertará al usuario y deshabilitará el botón de realizar el pedido (O creará una superposición O cualquier otro método)
Por ahora tengo esto:
function credit_limit_check() { /** page 13 is the check out page ID*/ if (is_page(13)) { if (is_user_logged_in()) { /* For reference purpose*/ /* get_user_meta( int $user_id, string $key = '', bool $single = false ) */ $ID = get_current_user_id(); $credit_val = get_user_meta($ID, 'credit_limit', true); $outstanding_val = get_user_meta($ID, 'outstanding_credit', true); $credit_breach = $credit_val - $outstanding_val; if ($credit_breach <= 0) { /*disable checkout button if not enough credit limit*/ echo '<button type="submit" class="button alt" name="woocommerce_checkout_place_order" id="place_order" value="Place order" data-value="Place order" disabled>Place order</button>'; echo '<script>alert("You have exceeded your credit limit, please make sure you have no outstanding bill")</script>'; } else { print_r("Huzzah! Good news! You have enough credit to proceed!"); } } else { print_r("Please login with your account before proceeding."); } } }El único problema es que las funciones en realidad crean un botón adicional en la parte superior de la página en lugar de desactivar el botón original. Entonces, me pregunto si esto es realmente factible, o tengo que modificar los archivos html directamente para lograr lo que se pretende (preferiblemente no)
Ahora, veo algunas preguntas similares, pero todas requieren la aplicación directa de php en las etiquetas html. No es aplicable para mi situación ya que estoy creando un complemento personalizado de wordpress. (Que es un archivo php individual).
Bueno, yo resolvería esto en dos partes.
function add_notices_for_checkout_credit() { if(is_checkout()) { if (is_user_logged_in()) { $ID = get_current_user_id(); $credit_breach = getUserCredit($ID); if ($credit_breach <= 0) { wc_add_notice( 'You have exceeded your credit limit, please make sure you have no outstanding bill', 'error' ); } else { wc_add_notice( 'Huzzah! Good news! You have enough credit to proceed!', 'success' ); } } } } add_action( 'wp', 'add_notices_for_checkout_credit'); function getUserCredit($ID) { $credit_val = get_user_meta($ID, 'credit_limit', true); $outstanding_val = get_user_meta($ID, 'outstanding_credit', true); $credit_breach = $credit_val - $outstanding_val; return $credit_breach; } Cuando el crédito suficiente se muestra. 
function change_button($order_button) { if (is_user_logged_in()) { $ID = get_current_user_id(); $credit_breach = getUserCredit($ID); if ($credit_breach <= 0) { $order_button_text = __( "No Credit", "woocommerce" ); $style = ' style="color:#fff;cursor:not-allowed;background-color:#999;text-align:center"'; return '<a class="button alt"'.$style.' name="woocommerce_checkout_place_order" id="place_order" >' . esc_html( $order_button_text ) . '</a>'; } } return $order_button; } add_filter( 'woocommerce_order_button_html', 'change_button');Esto deshabilitará el botón, y debería estar listo para comenzar.
PD: para mayor seguridad, use
woocommerce_checkout_update_order_reviewpara verificar si es una solicitud válida porque alguien puede crear un botón de envío usando la herramienta de desarrollo.