Añade opción para venta forzada de productos combinados en WooCommerce

Gracias a este código para WooCommerce podremos utilizar una nueva opción dentro de la ficha los datos de producto que añade la opción para venta “forzada” de productos combinados en WooCommerce. Esta opción te permite asociar otro producto al principal como si de un producto combinado se tratase. Así pues, cuando el usuario vaya a comprar el producto le indicará que debe comprar otro/s productos para poder terminar la compra ya que no se venden por separado.

Una vez añadido el snippet, veras un nuevo campo de configuración en la sección “Datos del producto” dentro de la pestaña “Productos vinculados > Combinado con” y ahí podrás seleccionar el listado de productos con los que deseas combinarlo.

venta-forzada-productos-combinados-woocommerce

Si tu cliente intenta comprar un producto combinado por separado, WooCommerce le mostrará un mensaje  y no le permitirá finalizar la compra.

 

Código para venta forzada de productos combinados en WooCommerce

// Añade una opción para vender productos combinados
if ( in_array( 'woocommerce/woocommerce.php', get_option( 'active_plugins' ) ) ){

	add_action( 'woocommerce_product_options_related', 'add_combined_products_settings_field' );
	function add_combined_products_settings_field(){
		global $post;
	
		wp_nonce_field( plugin_basename(__FILE__), 'woocommerce_combined_products_nonce' );
		?>
		<div class="options_group grouping show_if_simple show_if_variable show_if_external">
	
			<p class="form-field">
				<label for="combined_products"><?php _e( 'Combinado con: ', 'woocommerce' ); ?></label>
				<input type="hidden" class="wc-product-search" style="width: 50%;" id="combined_products" name="combined_products" data-	placeholder="<?php esc_attr_e( 'Search for a product…', 'woocommerce' ); ?>" data-action="woocommerce_json_search_products"	 data-multiple="true" data-exclude="<?php echo intval( $post->ID ); ?>" data-selected="<?php
					$product_ids = explode( ',', get_post_meta( $post->ID, '_combined_products', true ) );
					$json_ids    = array();
					foreach ( $product_ids as $product_id ) {
						$product = wc_get_product( $product_id );
						if ( is_object( $product ) ) {
							$json_ids[ $product_id ] = wp_kses_post( html_entity_decode( $product->get_formatted_name(), ENT_QUOTES, 	get_bloginfo( 'charset' ) ) );
						}
					}
					echo esc_attr( json_encode( $json_ids ) );
				?>" value="<?php echo implode( ',', array_keys( $json_ids ) ); ?>" /> <?php echo wc_help_tip( __( 'Selecciona el/los productos 	que sean obligatorios añadir al carro junto con este producto para poder comprarlo.', 'woocommerce' ) ); ?>
			</p>
		</div>
		<?php
	}
	
	// Guarda el valor del nuevo campo
	add_action( 'save_post', 'save_combined_products_settings_field', 99, 1 );
	function save_combined_products_settings_field( $post_id ){
	
		/* --- security verification --- */
		if( !wp_verify_nonce( $_POST['woocommerce_combined_products_nonce'], plugin_basename(__FILE__) ) ) {
			return $post_id;
	    	}
	
	    	if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
	    		return $post_id;
	    	}
	
	    	if( 'product' == $_POST['post_type'] ) {
	    		
	    		if( !current_user_can('edit_page', $post_id) ) {
	    			return $post_id;
	      		}
		} else {
		
			if( !current_user_can( 'edit_page', $post_id ) ) {
				return $post_id;
	        	}
	    	}
	    	/* - end security verification - */
	
	    	if( isset( $_POST[ 'combined_products' ] ) ) {
		
			$combined_products = isset( $_POST[ 'combined_products' ] ) ? $_POST[ 'combined_products' ] : array();
			update_post_meta( $post_id, '_combined_products', $combined_products );
	    	}
	}
	
	// Comprueba si están los productos combinados en el carrito
	add_action( 'woocommerce_checkout_process', 'check_combined_products' );
	add_action( 'woocommerce_check_cart_items', 'check_combined_products' );
	function check_combined_products(){
	
		$cart_content = WC()->cart->get_cart();
		$cart_items_ids = array();
		$products_left = array();
		$products_left_names = '';
		$combined_products_names = '';
	
		if ( !is_cart() && !is_checkout() ) return;
	
		//Obtiene el listado de IDs de los producto del carrito
		foreach ( $cart_content as $item ) {
			
			$cart_items_ids[] = $item[ 'product_id' ];
		}
		
		// Busca dentro del carrito si hay productos combinados y devuelve un mensaje de error si falta alguno
		foreach ( $cart_content as $key => $product ) {
	
			$combined_products = !empty( get_post_meta( $product[ 'data' ]->id, '_combined_products', true ) )? explode( ',', get_post_meta( $product[	 'data' ]->id, '_combined_products', true ) ) : array();
	
			foreach ( $combined_products as $value ) {
				
				$product_object = wc_get_product( $value );
				$combined_products_list[$product[ 'data' ]->id ][] = $product_object->get_title();
				if ( !in_array( $value, $cart_items_ids ) ) {
	
					$products_left[ $product[ 'data' ]->id ][ $value ] = $product_object->get_title();
				}
			}
	
			if ( isset( $products_left[ $product[ 'data' ]->id ] ) && !empty( $products_left[ $product[ 'data' ]->id ] ) ) {
					
				$products_left_names = implode(  ',', $products_left[ $product[ 'data' ]->id ] );
				$combined_products_names = implode(  ',', $combined_products_list[ $product[ 'data' ]->id ] );
	
				if ( 1 < count( $products_left[ $product[ 'data' ]->id ] ) && 1 < count( $combined_products ) ) {
					
					$error_message = 'El producto <strong>%s</strong> se vende junto con los productos: <strong>%s</strong>.<br> Te faltan 	añadir también al carrito los productos: <strong>%s</strong> para poder finalizar tu compra.<br><br>';
				}elseif ( 1 >= count( $products_left[ $product[ 'data' ]->id ] ) && 1 < count( $combined_products ) ) {
	
					$error_message = 'El producto <strong>%s</strong> se vende junto con los productos <strong>%s</strong>.<br> Te falta 	añadir también al carrito el producto <strong>%s</strong> para poder finalizar tu compra.<br><br>';
				}elseif ( 1 >= count( $products_left[ $product[ 'data' ]->id ] ) && 1 >= count( $combined_products ) ) {
	
					$error_message = 'El producto <strong>%s</strong> se vende junto con el producto <strong>%s</strong>.<br> Te falta añadir 	también al carrito el producto <strong>%s</strong> para poder finalizar tu compra.<br><br>';
				}
	
				wc_add_notice( sprintf( $error_message, $product[ 'data' ]->get_title(), $combined_products_names, $products_left_names ), 'error'	 );
			}
		}
	}
}
Ver más tutoriales de: WooCommerce

Tutoriales relaccionados

¿Necesitas un desarrollo a medida?

Login para aceder

LOGIN
REGISTRO