首页 文章

将产品“延期交货”替换为Woocommerce中的自定义字段值

提问于
浏览
2

首先,感谢您查看此问题 . 我搜索并经历了许多类似的问题,但我没有找到一个完美的解决方案 .

我使用wordpress / woocommerce Build 了一个网站,但是我们的大多数产品都有一个设定的提前期,因此一切都处于“后退 - 允许”状态 . 我想看看是否有可能在每个产品中创建一个自定义字段并替换“on backorder”文本以显示该自定义字段,而不是在每个产品页面上显示“延期交货” .

目前,我一直在使用以下代码,只更改每个产品的文本,但并非所有产品都在特定的提前期 .

add_filter( 'woocommerce_get_availability', 'backorder_text', 10, 2);
function backorder_text($available) {
 return str_replace('Available on backorder', 'Approx lead time: 2-4 working weeks', $available);
}

我很欣赏我需要在每个产品中设置一个自定义字段并设置时间,但我不完全确定如何将每个产品的特定自定义字段链接到该PHP代码(或者更确切地说,它是否实际可行) .

任何帮助都会很棒 - 即使它告诉我它无法完成!

1 回答

  • 1

    这可以通过以下代码完成,它们也将处理产品和产品变化:

    // Add a custom field in admin product edit pages - inventory tab
    add_action( 'woocommerce_product_options_stock_fields', 'add_product_options_stock_custom_field', 20 );
    function add_product_options_stock_custom_field() {
        global $product_object, $post;
    
        woocommerce_wp_text_input( array(
            'id'          => '_backorder_text',
            'type'        => 'text',
            'label'       => __( 'Backorders text', 'woocommerce' ),
            'description' => __( 'Backorders text. Add a custom backorders text to be displayed when products are on backorders.', 'woocommerce' ),
            'desc_tip'    => true,
        ) );
    
        // jQuery: HIDE the fied if backorders are not enabled
        ?>
        <script type="text/javascript">
        jQuery( function($){
            var a = 'select#_backorders',
                b = 'p._backorder_text_field';
    
            if( $(a).val() === 'no' )
                $(b).hide();
    
            $(a).on('change blur', function(){
                if( $(a).val() === 'no' )
                    $(b).hide();
                else
                    $(b).show();
            });
        });
        </script>
        <?php
    }
    
    // Save the custom field value from admin product edit pages - inventory tab
    add_action( 'woocommerce_process_product_meta', 'save_product_options_stock_custom_field', 20, 1 );
    function save_product_options_stock_custom_field( $product_id ) {
        if ( isset( $_POST['_backorder_text'] ) )
            update_post_meta( $product_id, '_backorder_text', sanitize_text_field( $_POST['_backorder_text'] ) );
    }
    
    // Variations: Add a custom field in admin variation options inventory
    add_action( 'woocommerce_variation_options_inventory', 'add_variation_settings_fields', 20, 3 );
    function add_variation_settings_fields( $loop, $variation_data, $variation_post ) {
    
        woocommerce_wp_text_input( array(
            'id'            => '_backorder_text'.$loop,
            'name'          => '_backorder_text['.$loop.']',
            'value'         => get_post_meta( $variation_post->ID, '_backorder_text', true ),
            'type'          => 'text',
            'label'         => __( 'Backorders text', 'woocommerce' ),
            'description'   => __( 'Backorders text. Add a custom backorders text to be displayed when products are on backorders.', 'woocommerce' ),
            'desc_tip'      => true,
            'wrapper_class' => 'form-row form-row-first',
        ) );
    }
    
    // Variations: Save a custom field value from admin variation options inventory
    add_action( 'woocommerce_save_product_variation', 'save_variation_settings_fields', 10, 2 );
    function save_variation_settings_fields( $variation_id, $i ) {
        if( isset( $_POST['_backorder_text'][$i] ) )
            update_post_meta( $variation_id, '_backorder_text', sanitize_text_field( $_POST['_backorder_text'][$i] ) );
    }
    
    add_filter( 'woocommerce_get_availability', 'custom_on_backorder_text', 10, 2 );
    function custom_on_backorder_text( $availability, $product ) {
        $backorder_text = get_post_meta( $product->get_id(), '_backorder_text', true );
    
        if( $availability['class'] === 'available-on-backorder' && ! empty( $backorder_text ) )
            $availability['availability'] = $backorder_text;
    
        return $availability;
    }
    

    代码位于活动子主题(或活动主题)的function.php文件中 . 经过测试和工作 .

    对于所有产品(变量产品除外,见后),您将获得:

    enter image description here

    enter image description here

    对于(可变产品的)产品变化:

    enter image description here

    enter image description here

相关问题