strip_tags remove quitar para funcion etiquetas ejemplo php wordpress woocommerce categories cart

php - remove - Permitir el pago solo cuando un producto de una categoría obligatoria está en el carrito



strip_tags wordpress (1)

Me gustaría evitar que cualquier cliente avance al proceso de 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 cierto producto. Encontré un código pero no puedo hacerlo. Lo agregué como un fragmento de código en mi instalación de Wordpress, pero lamentablemente no funciona y no hay mensajes de error aunque tengo la depuración activada. Aquí está el código que he encontrado en Github que puede necesitar modificación 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 &ndash; 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; }

Por lo tanto, estoy tratando de detener el pago (con un mensaje de error) si la categoría "hermano" es el único artículo en el carro. 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.


Aquí tienes una solución que hará el truco. Hay especialmente 2 funciones principales (las últimas) :

  1. La primera función (N ° 3) muestra su mensaje en la página del carro, cuando hay algo en el carro pero no la categoría de producto obligatorio. Muestra también el mensaje en las páginas de archivo de producto obligatorias (útil cuando se redirecciona al cliente desde la salida, ver más abajo) .
  2. La segunda función (N ° 4) redirige al cliente a las páginas de archivo de categoría obligatorias del producto cuando intenta realizar el pago y su carrito no tiene esa categoría de producto obligatoria faltante.

Defina antes su babosa de categoría obligatoria en la función your_mandatory_category_slug() .

Este es el código:

// Function that define the mandatory product category function your_mandatory_category_slug(){ // DEFINE HERE the SLUG of the needed product category $category = ''clothing''; return $category; } // Conditional function that returns true if the mandatory product category is in cart function has_mandatory_category(){ $category_needed = your_mandatory_category_slug(); $has_cat = false; // Iterrating each item in cart and detecting… foreach ( WC()->cart->get_cart() as $item ) { // Detects if the needed product category is in cart items if ( has_term($category_needed, ''product_cat'', $item[''product_id''] ) ) { $has_cat = true; break; } } return $has_cat; } // Function that display a message if there is not in cart a mandatory product category function mandatory_category_display_message() { $category_needed = your_mandatory_category_slug(); // check that cart is not empty (for cart and product category archives) if( !WC()->cart->is_empty() && ( is_cart() || is_product_category( $category_needed ) ) ){ $category_obj = get_term_by( ''slug'', $category_needed, ''product_cat'' ); if ( is_wp_error( $category_obj ) ) return; // Display message when product category is not in cart items if ( !has_mandatory_category() ) { $category_name = $category_obj->name; $category_url = get_term_link( $category_needed, ''product_cat'' ); // render a notice to explain why checkout is blocked wc_add_notice( sprintf( __( ''<strong>Reminder:</strong> You have to add in your cart, a product from "%1$s" category, to be allowed to check out. Please return <a href="%2$s"> here to "%1$s" product page</a>'', ''your_theme_domain''), $category_name, $category_url ), ''error'' ); } } } add_action( ''woocommerce_before_main_content'', ''mandatory_category_display_message'', 30 ); // for product mandatory category archives pages add_action( ''woocommerce_check_cart_items'', ''mandatory_category_display_message'' ); // for cat page // Function that redirect from checkout to mandatory product category archives pages function mandatory_category_checkout_redirect() { // If cart is not empty on checkout page if( !WC()->cart->is_empty() && is_checkout() ){ $category_needed = your_mandatory_category_slug(); // If missing product category => redirect to the products category page if ( !has_mandatory_category() ) wp_redirect( get_term_link( $category_needed, ''product_cat'' ) ); } } add_action(''template_redirect'', ''mandatory_category_checkout_redirect'');

Esto va en el archivo function.php de su tema hijo activo (o tema) o también en cualquier archivo de complemento.

Este código es probado y completamente funcional.