将自定义字段添加到发货选项卡中的 WooCommerce 产品设置页面,并根据值应用自动计算

Add custom fields to WooComerce product setting pages in the shipping tab and apply automatic calculations based on the values

基于对以下问题的回答:

我设法在 WooCommerce 运输选项中创建了两个额外的字段:


这些字段将通过管理员用户编辑字段或通过帮助我们用值预填充字段的计算获得值。

下面的代码片段显示了通过将代码片段添加到 functions.php 文件来创建字段。

add_action('woocommerce_product_options_shipping', function() {
  
    woocommerce_wp_text_input( 
        array( 
            'id'            => '_loading_meters', 
            'label'         => __('Loading meters', 'woocommerce'), 
            'desc_tip'      => 'true',
            'description'   => __( 'Vul hier de laadmeters in', 'woocommerce' ),
            'type'          => 'number',
            'custom_attributes' => array(
                            'step'  => 'any',
                            'min'   => '0'
                        ) 
        )
    );      

    woocommerce_wp_text_input( 
        array( 
            'id'            => '_loading_weight', 
            'label'         => __('Loading weight', 'woocommerce'), 
            'desc_tip'      => 'true',
            'description'   => __( 'Vul hier het laadgewicht in', 'woocommerce' ),
            'type'          => 'number',
            'custom_attributes' => array(
                            'step'  => 'any',
                            'min'   => '0'
                        ) 
        )
    );
    
});

第二个片段是保存管理员用户手动添加的值。此代码段也添加到 functions.php 文件中。

add_action('woocommerce_process_product_meta', function($post_id) {
    $product = wc_get_product($post_id);
    $num_loading_meters = isset($_POST['_loading_meters']) ? $_POST['_loading_meters'] : '';
    $num_loading_weight = isset($_POST['_loading_weight']) ? $_POST['_loading_weight'] : '';
    $product->update_meta_data('_loading_meters', sanitize_text_field($num_loading_meters));
    $product->update_meta_data('_loading_weight', sanitize_text_field($num_loading_weight)); $product->save();
});

作为最终结果,我希望使用计算自动填充两个字段,但仍可由管理员用户编辑。

加载米的计算:

装车重量计算:

有没有人可以指出正确的方向?

您可以使用 $product->get_length()$product->get_height()

进行计算

计算可以自动保存,但请注意,如果您要手动调整值,则必须在某处指明。否则保存时自动计算会被手动输入的值覆盖,反之亦然。

为了防止这种情况,我添加了一个额外的字段,即复选框。勾选时,会保存手动输入的值,如果没有,会自动进行计算,并保存这些值

所以你得到:

// Add custom fields to product shipping tab
function action_woocommerce_product_options_shipping() {
    // Checkbox
    woocommerce_wp_checkbox( 
        array( 
        'id'             => '_loading_checkbox',
        'label'          => __( 'My checkbox', 'woocommerce' ),
        'desc_tip'       => false,
        'description'    => __( 'If this is checked, the values ​​entered manually will be saved against the values ​​of the automatic calculation', 'woocommerce' )
        )
    );
    
    // Field loading meters
    woocommerce_wp_text_input(
        array( 
            'id'                => '_loading_meters', 
            'label'             => __( 'Loading meters', 'woocommerce' ), 
            'desc_tip'          => true,
            'description'       => __( 'Vul hier de laadmeters in', 'woocommerce' ),
            'type'              => 'number',
            'custom_attributes' => array(
                'step'  => 'any',
                'min'   => '0'
            )
        )
    );
    
    // Field loading weight
    woocommerce_wp_text_input( 
        array( 
            'id'                => '_loading_weight', 
            'label'             => __('Loading weight', 'woocommerce'), 
            'desc_tip'          => true,
            'description'       => __( 'Vul hier het laadgewicht in', 'woocommerce' ),
            'type'              => 'number',
            'custom_attributes' => array(
                'step'  => 'any',
                'min'   => '0'
            )
        )
    );
}
add_action( 'woocommerce_product_options_shipping', 'action_woocommerce_product_options_shipping', 10, 0 );

// Save
function action_woocommerce_admin_process_product_object( $product ) {
    // Checkbox has been checked
    if ( isset( $_POST['_loading_checkbox'] ) ) {
        // Isset
        if ( isset( $_POST['_loading_meters'] ) ) {
            $product->update_meta_data( '_loading_meters', sanitize_text_field( $_POST['_loading_meters'] ) );
        }
        
        // Isset
        if ( isset( $_POST['_loading_weight'] ) ) {
            $product->update_meta_data( '_loading_weight', sanitize_text_field( $_POST['_loading_weight'] ) );
        }
    } else {
        // Initialize
        $loading_meters = '';
        
        // Isset
        if ( isset( $_POST['_loading_meters'] ) ) {
            // Get values
            $height = $product->get_length();
            $length = $product->get_height();

            // NOT empty
            if ( ! empty( $height ) && ! empty( $length ) ) {
                // Calculation
                $loading_meters = ( $length * $height ) / 2.4;
                
                // Update meta
                $product->update_meta_data( '_loading_meters', $loading_meters );
            }
        }

        // Isset and NOT empty
        if ( isset( $_POST['_loading_weight'] ) && ! empty( $loading_meters ) ) {
            // Calculation
            $loading_weight = $loading_meters * 1750;
            
            // Update meta
            $product->update_meta_data( '_loading_weight', $loading_weight );
        }
    }
}
add_action( 'woocommerce_admin_process_product_object', 'action_woocommerce_admin_process_product_object', 10, 1 );

结果: