multi manager management labs inventario control avanzado atum php wordpress woocommerce dropdown stock

php - management - woocommerce product manager



Cómo agregar el estado de stock de variación al menú desplegable de variación de producto de Woocommerce (2)

Me gustaría mostrar el estado del stock (p. Ej. En stock / Fuera de stock) para cada variación de producto que se muestra en la lista desplegable de variaciones en la página de productos de Woocommerce. Copié la función relevante en el archivo functions.php de mi tema y puedo editar el contenido, pero no estoy seguro de cómo extraer el estado de stock requerido para cada variación.

// Updated Woocommerce Product Variation Select if ( ! function_exists( ''wc_dropdown_variation_attribute_options'' ) ) { /** * Output a list of variation attributes for use in the cart forms. * * @param array $args * @since 2.4.0 */ /* function wc_dropdown_variation_attribute_options( $args = array() ) { $args = wp_parse_args( apply_filters( ''woocommerce_dropdown_variation_attribute_options_args'', $args ), array( ''options'' => false, ''attribute'' => false, ''product'' => false, ''selected'' => false, ''name'' => '''', ''id'' => '''', ''class'' => '''', ''show_option_none'' => __( ''Choose an option'', ''woocommerce'' ), ) ); $options = $args[''options'']; $product = $args[''product'']; $attribute = $args[''attribute'']; $name = $args[''name''] ? $args[''name''] : ''attribute_'' . sanitize_title( $attribute ); $id = $args[''id''] ? $args[''id''] : sanitize_title( $attribute ); $class = $args[''class'']; $show_option_none = $args[''show_option_none''] ? true : false; $show_option_none_text = $args[''show_option_none''] ? $args[''show_option_none''] : __( ''Choose an option'', ''woocommerce'' ); // We''ll do our best to hide the placeholder, but we''ll need to show something when resetting options. if ( empty( $options ) && ! empty( $product ) && ! empty( $attribute ) ) { $attributes = $product->get_variation_attributes(); $options = $attributes[ $attribute ]; } $html = ''''; $html .= '''' . esc_html( $show_option_none_text ) . ''''; if ( ! empty( $options ) ) { if ( $product && taxonomy_exists( $attribute ) ) { // Get terms if this is a taxonomy - ordered. We need the names too. $terms = wc_get_product_terms( $product->get_id(), $attribute, array( ''fields'' => ''all'' ) ); foreach ( $terms as $term ) { if ( in_array( $term->slug, $options ) ) { $html .= ''slug ) . ''" '' . selected( sanitize_title( $args[''selected''] ), $term->slug, false ) . ''>'' . esc_html( apply_filters( ''woocommerce_variation_option_name'', $term->name ) ) . '' ''; } } } else { foreach ( $options as $option ) { // This handles lt 2.4.0 bw compatibility where text attributes were not sanitized. $selected = sanitize_title( $args[''selected''] ) === $args[''selected''] ? selected( $args[''selected''], sanitize_title( $option ), false ) : selected( $args[''selected''], $option, false ); $html .= '''' . esc_html( apply_filters( ''woocommerce_variation_option_name'', $option ) ) . '' Output Stock Details Here ''; } } } $html .= ''''; echo apply_filters( ''woocommerce_dropdown_variation_attribute_options_html'', $html, $args ); } }

Puedo extraer el nivel de existencias para el producto general, pero ahora para cada variación.

Cualquier ayuda sería muy apreciada.


Ok, primero necesitarás obtener variaciones de productos como esta:

$variations = $product->get_available_variations();

Y dentro del ciclo de opciones, debe recorrer las variaciones y encontrar el estado actual del stock de opciones

foreach ($variations as $variation) { if($variation[''attributes''][$name] == $option) { $stock = $variation[''is_in_stock'']; } }

Fuera del ciclo de variaciones, debe agregar el texto para las variaciones en existencia y fuera de existencia

if( $stock == 1) { $stock_content = '' - In stock''; } else { $stock_content = '' - Out of stock''; }

Luego cambie el html para incluir una variable adicional ($ stock_content)

$html .= ''<option value="'' . esc_attr( $option ) . ''" '' . $selected . ''>'' . esc_html( $option . $stock_content ) . ''</option>'';

Entonces una función completa se verá así:

add_filter( ''woocommerce_dropdown_variation_attribute_options_html'', ''show_stock_status_in_dropdown'', 10, 2); function show_stock_status_in_dropdown( $html, $args ) { $options = $args[''options'']; $product = $args[''product'']; $attribute = $args[''attribute'']; $name = $args[''name''] ? $args[''name''] : ''attribute_'' . sanitize_title( $attribute ); $id = $args[''id''] ? $args[''id''] : sanitize_title( $attribute ); $class = $args[''class'']; $show_option_none = $args[''show_option_none''] ? true : false; $show_option_none_text = $args[''show_option_none''] ? $args[''show_option_none''] : __( ''Choose an option'', ''woocommerce'' ); // Get all product variations $variations = $product->get_available_variations(); if ( empty( $options ) && ! empty( $product ) && ! empty( $attribute ) ) { $attributes = $product->get_variation_attributes(); $options = $attributes[ $attribute ]; } $html = ''<select id="'' . esc_attr( $id ) . ''" class="'' . esc_attr( $class ) . ''" name="'' . esc_attr( $name ) . ''" data-attribute_name="attribute_'' . esc_attr( sanitize_title( $attribute ) ) . ''" data-show_option_none="'' . ( $show_option_none ? ''yes'' : ''no'' ) . ''">''; $html .= ''<option value="">'' . esc_html( $show_option_none_text ) . ''</option>''; if ( ! empty( $options ) ) { if ( $product && taxonomy_exists( $attribute ) ) { // Get terms if this is a taxonomy - ordered. We need the names too. $terms = wc_get_product_terms( $product->get_id(), $attribute, array( ''fields'' => ''all'' ) ); foreach ( $terms as $term ) { if ( in_array( $term->slug, $options ) ) { $html .= ''<option value="'' . esc_attr( $term->slug ) . ''" '' . selected( sanitize_title( $args[''selected''] ), $term->slug, false ) . ''>'' . esc_html( apply_filters( ''woocommerce_variation_option_name'', $term->name ) ) . ''</option>''; } } } else { foreach ( $options as $option ) { foreach ($variations as $variation) { if($variation[''attributes''][$name] == $option) { $stock = $variation[''is_in_stock'']; } } if( $stock == 1) { $stock_content = '' - (In Stock)''; } else { $stock_content = '' - (Out of Stock)''; } // This handles < 2.4.0 bw compatibility where text attributes were not sanitized. $selected = sanitize_title( $args[''selected''] ) === $args[''selected''] ? selected( $args[''selected''], sanitize_title( $option ), false ) : selected( $args[''selected''], $option, false ); $html .= ''<option value="'' . esc_attr( $option ) . ''" '' . $selected . ''>'' . esc_html( $option . $stock_content ) . ''</option>''; } } } $html .= ''</select>''; return $html; }


Actualización 2019 (solo para productos variables con 1 menú desplegable )

De todos modos, esto realmente funcionará cuando SOLO haya un campo de selección desplegable (por lo tanto, un atributo para las variaciones).

Con múltiples atributos (por lo tanto, múltiples campos de selección desplegable) muestra algo que puede estar mal dependiendo de la combinación de términos de atributos de estado de stock de variaciones.

Vea la captura de pantalla al final que muestra una vitrina incorrecta ...

He probado el código de Ali_k , pero no funcionaba en mi servidor de prueba cuando los productos variables tienen múltiples menús desplegables.

Así que he realizado algunos cambios en el código de Ali_k para que esto funcione en mi servidor de prueba (con la última versión de WooCommerce) .

Para manejar pedidos pendientes ver: Agregar el estado de existencias de pedidos pendientes al menú desplegable de productos variables de Woocommerce

El código:

// Function that will check the stock status and display the corresponding additional text function get_stock_status_text( $product, $name, $term_slug ){ foreach ( $product->get_available_variations() as $variation ){ if($variation[''attributes''][$name] == $term_slug ) { $stock = $variation[''is_in_stock'']; break; } } return $stock == 1 ? '' - (In Stock)'' : '' - (Out of Stock)''; } // The hooked function that will add the stock status to the dropdown options elements. add_filter( ''woocommerce_dropdown_variation_attribute_options_html'', ''show_stock_status_in_dropdown'', 10, 2); function show_stock_status_in_dropdown( $html, $args ) { // Only if there is a unique variation attribute (one dropdown) if( sizeof($args[''product'']->get_variation_attributes()) == 1 ) : $options = $args[''options'']; $product = $args[''product'']; $attribute = $args[''attribute'']; // The product attribute taxonomy $name = $args[''name''] ? $args[''name''] : ''attribute_'' . sanitize_title( $attribute ); $id = $args[''id''] ? $args[''id''] : sanitize_title( $attribute ); $class = $args[''class'']; $show_option_none = $args[''show_option_none''] ? true : false; $show_option_none_text = $args[''show_option_none''] ? $args[''show_option_none''] : __( ''Choose an option'', ''woocommerce'' ); if ( empty( $options ) && ! empty( $product ) && ! empty( $attribute ) ) { $attributes = $product->get_variation_attributes(); $options = $attributes[ $attribute ]; } $html = ''<select id="'' . esc_attr( $id ) . ''" class="'' . esc_attr( $class ) . ''" name="'' . esc_attr( $name ) . ''" data-attribute_name="attribute_'' . esc_attr( sanitize_title( $attribute ) ) . ''" data-show_option_none="'' . ( $show_option_none ? ''yes'' : ''no'' ) . ''">''; $html .= ''<option value="">'' . esc_html( $show_option_none_text ) . ''</option>''; if ( ! empty( $options ) ) { if ( $product && taxonomy_exists( $attribute ) ) { $terms = wc_get_product_terms( $product->get_id(), $attribute, array( ''fields'' => ''all'' ) ); foreach ( $terms as $term ) { if ( in_array( $term->slug, $options ) ) { // HERE Added the function to get the text status $stock_status = get_stock_status_text( $product, $name, $term->slug ); $html .= ''<option value="'' . esc_attr( $term->slug ) . ''" '' . selected( sanitize_title( $args[''selected''] ), $term->slug, false ) . ''>'' . esc_html( apply_filters( ''woocommerce_variation_option_name'', $term->name ) . $stock_status ) . ''</option>''; } } } else { foreach ( $options as $option ) { $selected = sanitize_title( $args[''selected''] ) === $args[''selected''] ? selected( $args[''selected''], sanitize_title( $option ), false ) : selected( $args[''selected''], $option, false ); // HERE Added the function to get the text status $stock_status = get_the_stock_status( $product, $name, $option ); $html .= ''<option value="'' . esc_attr( $option ) . ''" '' . $selected . ''>'' . esc_html( apply_filters( ''woocommerce_variation_option_name'', $option ) . $stock_status ) . ''</option>''; } } } $html .= ''</select>''; endif; return $html; }

El código va en el archivo function.php de su tema secundario activo (o tema) o también en cualquier archivo de complemento.

Probado y funciona en productos variables que tienen un solo atributo para variaciones ...

Con el código de Ali_K, aquí un ejemplo de un texto mostrado incorrecto para un producto variable con múltiples campos de selección (por lo tanto, múltiples atributos para variaciones) :