避免丢失 Woocommerce 中管理产品自定义字段的值

Avoid loosing values from admin product custom fields in Woocommerce

在 Woocommerce 中,我在常规设置选项卡下的管理产品页面中添加了一些自定义字段并且它有效。但是,我添加了一些第 3 方插件,每次处理订单时都会删除这些字段中保存的所有内容。

常规选项卡上的默认字段,甚至其他第 3 方的字段都没有被删除。我想知道是否有比我这样做更好的方法来创建字段和存储数据。

这是我的代码:

add_action( 'woocommerce_product_options_pricing', 'mpq_add_location_textbox_to_products' );        

function mpq_add_location_textbox_to_products() {           
    if ( (has_term( 'workshops', 'product_cat' ) )){     
        woocommerce_wp_textarea_input( array( 
            'id' => 'mpq_location', 
            'class' => '', 
            'label' => 'Location:',
            'placeholder' => 'Enter Location'
            ) 
        );      
    }
}

add_action( 'save_post', 'mpq_save_location_textbox_to_post_meta' );

function mpq_save_location_textbox_to_post_meta( $product_id ) {
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;
    if ( isset( $_POST['mpq_location'] ) ) {
            update_post_meta( $product_id, 'mpq_location', $_POST['mpq_location'] );
    } else delete_post_meta( $product_id, 'mpq_location' );
}

有一些错误和遗漏的东西……试试下面的方法应该可以解决您的问题:

add_action( 'woocommerce_product_options_pricing', 'add_location_product_custom_textaread_field' );
function add_location_product_custom_textaread_field() {
    global $post;

    $term = 'workshops'; // Product category term slug

    if ( has_term( $term, 'product_cat', $post->ID ) ){
        woocommerce_wp_textarea_input( array(
            'id' => '_mpq_location',
            'class' => '',
            'label' => 'Location:',
            'placeholder' => 'Enter Location'
        ) );

        echo '<input type="hidden" name="_mpq_location_nonce" value="' . wp_create_nonce() . '">';
    }
}

add_action( 'save_post_product', 'save_location_product_custom_textaread_field', 20, 1 );
function save_location_product_custom_textaread_field( $post_id ) {
    if ( ! isset( $_POST[ '_mpq_location_nonce' ] ) ) {
        return $post_id;
    }
    if ( ! wp_verify_nonce( $_POST[ '_mpq_location_nonce' ] ) ) {
        return $post_id;
    }
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return $post_id;
    }
    if ( ! current_user_can( 'edit_product', $post_id ) ) {
        return $post_id;
    }
    if ( isset( $_POST['_mpq_location'] ) ) {
        update_post_meta( $post_id, '_mpq_location', sanitize_textarea_field($_POST['_mpq_location']) );
    }
}

代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。

I have changed the meat key to _mpq_location and removed the else delete_post_meta()