独立站用户要求

Woocommerce外贸独立站,客户的情况比较特殊,产品会有很多暂时无货的,需要展示出来,但又要方便用户看产品。可变产品属性比较多,下拉会有大部分无货的选项,所以要清晰明了的展示。

WooCommerce本身已经提供一个设置,允许在产品或可变体产品缺货时完全删除它们,使其在商店页面或产品页面上不再可见。然而,如果您的商店计划重新上架这些产品,最好不要将其完全删除。将这些缺货产品的可见性更改为可见,可以改善客户体验,即使没有货,但可以让客户看到有不同的选项可用。

WooCommerce删除缺货产品

要删除缺货产品,前往“WooCommerce > 设置 > 产品 > 库存设置”部分。在那里,您会找到”售罄可见性”复选框。如果您想要完全隐藏这些产品,包括从目录和下拉列表中移除它们,请选中此框。

WooCommerce 如何禁用缺货的属性选项

 

WooCommerce禁用缺货的可变产品选项

我们只需要一小段代码,就可以检查产品库存并将变体标记为不可用状态。然后,WooCommerce会自动将下拉列表中的选项显示为禁用状态。

以下是实现此效果的代码片段,添加到子主题Function.php文件中。

function ace_grey_out_variations_when_out_of_stock( $is_active, $variation ) {
if ( ! $variation->is_in_stock() ) {
$is_active = false;
}
return $is_active;
}
add_filter( 'woocommerce_variation_is_active', 'ace_grey_out_variations_when_out_of_stock', 10, 2 );

 

我们还可以在所有禁用选项后面添加文本”(缺货/Out of stock)”,这样就可以一目了然了,继续添加以下代码片段。这需要使用一些JavaScript来实现。当然,您可以根据需要在代码片段中更改文本。

 function ace__add_text_out_of_stock_variations() {
wp_add_inline_script( 'wc-add-to-cart-variation', "
var outOfStockText = ' (out of stock)'
jQuery('.variations_form').on('woocommerce_update_variation_values', function() {
jQuery(this).find('option:disabled').text(function(i, v) {
return v.replace(outOfStockText, '') + ' ' + outOfStockText
})
})
" );
}
add_action( 'wp_enqueue_scripts', 'ace__add_text_out_of_stock_variations' ); 

效果展示

WooCommerce 如何禁用缺货的属性选项WooCommerce 如何禁用缺货的属性选项

 

以上方法是先禁用out of stock无货产品的状态,然后根据状态去添加文本后缀。

显示所有状态

以下片段代码可以在woocommerce 可变属性下拉菜单后面显示所有状态,且不禁用选择。


// 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 ) {
$is_in_stock = $variation['is_in_stock'];
$backordered = get_post_meta( $variation['variation_id'], '_backorders', true );
$stock_qty = get_post_meta( $variation['variation_id'], '_stock', true );
break;
}
}
$stock_status_text = $is_in_stock == 1 ? ' - (In Stock)' : ' - (Out of Stock)';
return $backordered !== 'no' && $stock_qty <= 0 ? ' - (On Backorder)' : $stock_status_text;
}

// 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_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;
}