如何在 WooCommerce 4+ 中为产品添加自定义库存状态 [英] How to add custom stock status to products in WooCommerce 4+

查看:31
本文介绍了如何在 WooCommerce 4+ 中为产品添加自定义库存状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用以下代码在 WooCommerce 4.0 中添加新的库存状态.

新的状态是:

  • 预购
  • 联系我们

function add_custom_stock_type() {?><script type="text/javascript">jQuery(函数(){jQuery('._stock_status_field').not('.custom-stock-status').remove();});<?phpwoocommerce_wp_select( array( 'id' => '_stock_status', 'wrapper_class' => 'custom-stock-status', 'label' => __( 'Stock status', 'woocommerce'), 'options' => 数组('进货' =>__( 'Available', 'woocommerce' ),//改了名字'缺货' =>__( 'Sold out', 'woocommerce' ),//改了名字'onbackorder' =>__( 'Preorder : Pending Distributor release', 'woocommerce' ),//改了名字'联系' =>__( '联系我们获取可用性', 'woocommerce' ),//添加了新的'预购' =>__( 'On Preorder: Pending Distributor release', 'woocommerce' ),//添加了新的), 'desc_tip' =>真的,描述"=>__( '控制产品在前端是否被列为有货"或缺货".', 'woocommerce' ) );}add_action('woocommerce_product_options_stock_status', 'add_custom_stock_type');函数 save_custom_stock_status( $product_id ) {update_post_meta( $product_id, '_stock_status', wc_clean( $_POST['_stock_status'] ) );}add_action('woocommerce_process_product_meta', 'save_custom_stock_status',99,1);函数 woo_add_custom_general_fields_save_two( $post_id ){//选择$woocommerce_select = $_POST['_stock_status'];if( !empty( $woocommerce_select ) )update_post_meta( $post_id, '_stock_status', esc_attr( $woocommerce_select ) );别的update_post_meta( $post_id, '_stock_status', '' );}函数 woocommerce_get_custom_availability( $data, $product ) {开关($product->stock_status){案例有货":$data = array( 'availability' => __( 'Available', 'woocommerce' ), 'class' => 'in-stock' );//改名休息;情况缺货":$data = array( 'availability' => __( 'Sold Out', 'woocommerce' ), 'class' => 'out-of-stock' );//改名休息;案例'onbackorder':$data = array( 'availability' => __( 'Preorder : Pending Distributor release', 'woocommerce' ), 'class' => 'onbackorder' );//改名休息;案例联系人":$data = array( '可用性' => __( '联系我们获取可用性', 'woocommerce' ), 'class' => 'contact' );//添加新的休息;案例预购":$data = array( 'availability' => __( 'On Preorder : Pending Distributor release', 'woocommerce' ), 'class' => 'preorder' );//添加新的休息;}返回 $data;}add_action('woocommerce_get_availability', 'woocommerce_get_custom_availability', 10, 4);


作品:

  • 后端:下拉菜单中添加了新状态,我可以选择我想要的状态.

不起作用:

  • 前端:单个产品页面未显示正确状态.

  • 后端:在管理产品列表表上显示新状态

谁能帮我解决这个问题?

解决方案

上次更新:11/21 - 在 WordPress 5.8.2 & 中测试WooCommerce 5.9.0

代码位于活动子主题(或活动主题)的functions.php 文件中.


<块引用>

使用woocommerce_product_stock_status_options

而不是woocommerce_product_options_stock_status.

这样您就可以立即添加状态而不是替换现有的下拉列表


<块引用>

也使用 woocommerce_get_availability_text &woocommerce_get_availability_classwoocommerce_get_availability 对面.

这样您就不必再次添加现有状态

//添加新的股票状态选项函数 filter_woocommerce_product_stock_status_options( $status ) {//添加新状态$status['pre_order'] = __( 'Pre order', 'woocommerce');$status['contact_us'] = __('联系我们', 'woocommerce');返回 $status;}add_filter('woocommerce_product_stock_status_options', 'filter_woocommerce_product_stock_status_options', 10, 1);//可用性文本函数 filter_woocommerce_get_availability_text( $availability, $product ) {//获取库存状态开关($product->get_stock_status()){案例'pre_order':$availability = __( '预购', 'woocommerce' );休息;案例contact_us":$availability = __( '联系我们', 'woocommerce' );休息;}返回 $ 可用性;}add_filter('woocommerce_get_availability_text', 'filter_woocommerce_get_availability_text', 10, 2);//可用性 CSS 类函数 filter_woocommerce_get_availability_class( $class, $product ) {//获取库存状态开关($product->get_stock_status()){案例'pre_order':$class = '预购';休息;案例contact_us":$class = '联系我们';休息;}返回 $class;}add_filter('woocommerce_get_availability_class', 'filter_woocommerce_get_availability_class', 10, 2);



<块引用>

使用 woocommerce_admin_stock_html 在管理产品列表中显示新的库存状态

//管理库存 html函数 filter_woocommerce_admin_stock_html( $stock_html, $product ) {//简单的如果($product->is_type('简单')){//获取库存状态$product_stock_status = $product->get_stock_status();//多变的} elseif ( $product->is_type( '变量' ) ) {foreach( $product->get_visible_children() as $variation_id ) {//获取产品$variation = wc_get_product( $variation_id );//获取库存状态$product_stock_status = $variation->get_stock_status();/*当前将显示循环中最后一个变量的状态.因此,从这里开始,您需要添加自己的逻辑,具体取决于您对自定义库存状态的期望.默认情况下,对于现有状态.显示在可变产品的管理产品列表中的状态确定为:- 如果有儿童库存,产品应该有库存.- 如果所有儿童都缺货,则产品应该缺货.- 如果所有儿童都缺货,产品应该缺货.- 如果至少有一名儿童处于缺货状态,而其余儿童缺货,则产品应处于缺货状态.*/}}//库存状态开关($product_stock_status){案例'pre_order':$stock_html = '


<块引用>

可选:如果需要,自定义库存状态可用于您已经有权访问 $product 对象或使用 global $product 的钩子.

//基于全局$product的例子//获取全局产品对象全球$产品;//是WC产品如果 ( is_a( $product, 'WC_Product' ) ) {//获取库存状态$product_stock_status = $product->get_stock_status();//相比if ( $product_stock_status == '我的自定义库存状态' ) {//等等..}}

I am using the following code to add new stock statuses in WooCommerce 4.0.

The new statuses are:

  • Preorder
  • Contact us

function add_custom_stock_type() {
    ?>
    <script type="text/javascript">
    jQuery(function(){
        jQuery('._stock_status_field').not('.custom-stock-status').remove();
    });
    </script>
<?php   

    woocommerce_wp_select( array( 'id' => '_stock_status', 'wrapper_class' => 'custom-stock-status', 'label' => __( 'Stock status', 'woocommerce' ), 'options' => array(
        'instock'     => __( 'Available', 'woocommerce' ), //changed the name
        'outofstock'  => __( 'Sold out', 'woocommerce' ), //changed the name
        'onbackorder' => __( 'Preorder : Pending Distributor release', 'woocommerce' ), //changed the name
        'contact'     => __( 'Contact us for Availability', 'woocommerce' ), //added new one
        'preorder'    => __( 'On Preorder: Pending Distributor release', 'woocommerce' ), //added new one
    ), 'desc_tip' => true, 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ) ) );
}
add_action('woocommerce_product_options_stock_status', 'add_custom_stock_type');

function save_custom_stock_status( $product_id ) {
    update_post_meta( $product_id, '_stock_status', wc_clean( $_POST['_stock_status'] ) );
}
add_action('woocommerce_process_product_meta', 'save_custom_stock_status',99,1);

function woo_add_custom_general_fields_save_two( $post_id ){
    // Select
    $woocommerce_select = $_POST['_stock_status'];
    if( !empty( $woocommerce_select ) )
        update_post_meta( $post_id, '_stock_status', esc_attr( $woocommerce_select ) );
    else
    update_post_meta( $post_id, '_stock_status', '' );
    }

function woocommerce_get_custom_availability( $data, $product ) {
    switch( $product->stock_status ) {
        case 'instock':
            $data = array( 'availability' => __( 'Available', 'woocommerce' ), 'class' => 'in-stock' ); //changed name
        break;
        case 'outofstock':
            $data = array( 'availability' => __( 'Sold Out', 'woocommerce' ), 'class' => 'out-of-stock' ); //changed name
        break;
        case 'onbackorder':
            $data = array( 'availability' => __( 'Preorder : Pending Distributor release', 'woocommerce' ), 'class' => 'onbackorder' ); //changed name
        break;
        case 'contact':
            $data = array( 'availability' => __( 'Contact us for Availability', 'woocommerce' ), 'class' => 'contact' ); //added new one
        break;
        case 'preorder':
            $data = array( 'availability' => __( 'On Preorder : Pending Distributor release', 'woocommerce' ), 'class' => 'preorder' ); //added new one
        break;
    }
    return $data;
}
add_action('woocommerce_get_availability', 'woocommerce_get_custom_availability', 10, 4);


Works:

  • Backend: The new status is added in the dropdown menu, I can select the status I want.

Does not work:

  • Front end: on single product page is not showing the correct status.

  • Backend: Display the new status on the admin products list table

Someone who can assist me with this?

解决方案

Last update: 11/21 - Tested in WordPress 5.8.2 & WooCommerce 5.9.0

Code goes in functions.php file of the active child theme (or active theme).


Use woocommerce_product_stock_status_options

instead of woocommerce_product_options_stock_status.

This way you can immediately add a status instead of replace the existing dropdown


Also use woocommerce_get_availability_text & woocommerce_get_availability_class opposite woocommerce_get_availability.

This way you don't have to add the existing statuses again

// Add new stock status options
function filter_woocommerce_product_stock_status_options( $status ) {
    // Add new statuses
    $status['pre_order'] = __( 'Pre order', 'woocommerce' );
    $status['contact_us'] = __( 'Contact us', 'woocommerce' );

    return $status;
}
add_filter( 'woocommerce_product_stock_status_options', 'filter_woocommerce_product_stock_status_options', 10, 1 );

// Availability text
function filter_woocommerce_get_availability_text( $availability, $product ) {
    // Get stock status
    switch( $product->get_stock_status() ) {
        case 'pre_order':
            $availability = __( 'Pre order', 'woocommerce' );
        break;
        case 'contact_us':
            $availability = __( 'Contact us', 'woocommerce' );
        break;
    }

    return $availability; 
}
add_filter( 'woocommerce_get_availability_text', 'filter_woocommerce_get_availability_text', 10, 2 );

// Availability CSS class
function filter_woocommerce_get_availability_class( $class, $product ) {
    // Get stock status
    switch( $product->get_stock_status() ) {
        case 'pre_order':
            $class = 'pre-order';
        break;
        case 'contact_us':
            $class = 'contact-us';
        break;
    }

    return $class;
}
add_filter( 'woocommerce_get_availability_class', 'filter_woocommerce_get_availability_class', 10, 2 );



Use woocommerce_admin_stock_html to display the new stock status on the admin products list table

// Admin stock html
function filter_woocommerce_admin_stock_html( $stock_html, $product ) {
    // Simple
    if ( $product->is_type( 'simple' ) ) {
        // Get stock status
        $product_stock_status = $product->get_stock_status();
    // Variable
    } elseif ( $product->is_type( 'variable' ) ) {
        foreach( $product->get_visible_children() as $variation_id ) {
            // Get product
            $variation = wc_get_product( $variation_id );
            
            // Get stock status
            $product_stock_status = $variation->get_stock_status();
            
            /*
            Currently the status of the last variant in the loop will be displayed.
            
            So from here you need to add your own logic, depending on what you expect from your custom stock status.
            
            By default, for the existing statuses. The status displayed on the admin products list table for variable products is determined as:
            
            - Product should be in stock if a child is in stock.
            - Product should be out of stock if all children are out of stock.
            - Product should be on backorder if all children are on backorder.
            - Product should be on backorder if at least one child is on backorder and the rest are out of stock.
            */
        }
    }
    
    // Stock status
    switch( $product_stock_status ) {
        case 'pre_order':
            $stock_html = '<mark class="pre-order" style="background:transparent none;color:#33ccff;font-weight:700;line-height:1;">' . __( 'Pre order', 'woocommerce' ) . '</mark>';
        break;
        case 'contact_us':
            $stock_html = '<mark class="contact-us" style="background:transparent none;color:#cc33ff;font-weight:700;line-height:1;">' . __( 'Contact us', 'woocommerce' ) . '</mark>';
        break;
    }
 
    return $stock_html;
}
add_filter( 'woocommerce_admin_stock_html', 'filter_woocommerce_admin_stock_html', 10, 2 );


Optional: if desired, the custom stock status can be used in hooks where you already have access to the $product object or you use global $product.

// An example based on global $product
// Get the global product object
global $product;

// Is a WC product
if ( is_a( $product, 'WC_Product' ) ) {
    // Get stock status
    $product_stock_status = $product->get_stock_status();
    
    // Compare
    if ( $product_stock_status == 'My custom stock status' ) {
        // Etc..
    }
}

这篇关于如何在 WooCommerce 4+ 中为产品添加自定义库存状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆