Permitir el pago solo cuando un producto de una categoría obligatoria está en el carrito
Me gustaría detener a cualquier cliente que avance al pago si no tiene una categoría de producto en particular en su cesta. También me gustaría decirles con un mensaje de error que necesitan agregar un determinado producto. Encontré un código pero no puedo funcionar. Lo agregué como un fragmento de código en mi instalación de Wordpress, pero lamentablemente no funciona y no hay mensajes de error a pesar de que tengo la depuración activada. Aquí está el código que he encontrado en Github que puede necesitar modificaciones para que esto funcione:
function sv_wc_prevent_checkout_for_category() {
// set the slug of the category for which we disallow checkout
$category = 'sibling';
// get the product category
$product_cat = get_term_by( 'slug', $category, 'product_cat' );
// sanity check to prevent fatals if the term doesn't exist
if ( is_wp_error( $product_cat ) ) {
return;
}
$category_name = '<a href="' . get_term_link( $category, 'product_cat' ) . '">' . $product_cat->name . '</a>';
// check if this category is the only thing in the cart
if ( sv_wc_is_category_alone_in_cart( $category ) ) {
// render a notice to explain why checkout is blocked
wc_add_notice( sprintf( 'Hi there! Looks like your cart only contains products from the %1$s category – you must purchase a product from another category to check out.', $category_name ), 'error' );
}
}
add_action( 'woocommerce_check_cart_items', 'sv_wc_prevent_checkout_for_category' );
/**
* Checks if a cart contains exclusively products in a given category
*
* @param string $category the slug of the product category
* @return bool - true if the cart only contains the given category
*/
function sv_wc_is_category_alone_in_cart( $category ) {
// check each cart item for our category
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
// if a product is not in our category, bail out since we know the category is not alone
if ( ! has_term( $category, 'product_cat', $cart_item['data']->id ) ) {
return false;
}
}
// if we're here, all items in the cart are in our category
return true;
}
Así que estoy buscando detener el pago (con mensaje de error) si la categoría 'hermano' es el único artículo en el carrito. Tengo una categoría 'estándar' que debe estar en la cesta antes de que el cliente llegue a la caja. Espero que esto tenga sentido.