wordpress 添加自定义字段到WooComerce产品设置页面中的运输选项卡,并根据值应用自动计算

icomxhvb  于 2023-01-16  发布在  WordPress
关注(0)|答案(1)|浏览(189)

基于对以下问题的回答:

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

  • 用于添加装载 Jmeter 的字段
  • 添加装运重量的字段

这些字段将通过管理员用户编辑字段或通过帮助我们用值预填充字段的计算来获得值。
下面的代码片段显示了通过将代码片段添加到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();
});

作为一个最终的结果,我想实现这两个字段填写自动使用计算,但仍然可以编辑的管理员用户。
负载 Jmeter 的计算:

  • (长度(米))x(高度(米))/ 2.4

装载重量的计算:

  • 装载 Jmeter * 1750

有人能给我指个路吗?

rt4zxlrg

rt4zxlrg1#

对于计算,您可以使用$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 );
    • 结果:**

相关问题