通过另一个自定义字段更新自定义字段

时间:2015-06-10 15:01:25

标签: wordpress woocommerce custom-fields

我在WordPress中使用了很多custom_fields。

目前我正在与WooCommerce合作,我不知道我的问题是WP还是Woo相关。

我有一个自定义字段设置作为选择框。 我可以选择几个项目,如:

  1. IN_STOCK
  2. sold_out
  3. 当我选择“sold_out”并保存帖子/产品时,我不仅要保存此字段,还要将“_stock_status”设置为“outofstock”。

    字段“_stock_status”是默认的WooCommerce字段。它也是一个下拉框。您可以选择值“instock”或“outofstock”。

    Iam正在使用WooCommerce保存功能,名为woocommerce_process_product_meta

    我以为我可以运行两个update_post_meta函数。但那不起作用。

    我尝试了以下操作,进行测试,检查我的自定义字段是否为空。如果它不为空,则使用所选值更新它,并更新“_stock_status”。

    $woocommerce_select = $_POST['_my_custom_field'];
    
    if( !empty( $woocommerce_select ) ) {
           update_post_meta( $post_id, '_my_custom_field', esc_attr( $woocommerce_select ) );
           update_post_meta( $post_id, '_stock_status', 'outofstock' );
    }
    

    使用此功能,我可以保存_my_custom_field,但_stock_status不会更改。

    我也试过了这个和其他if函数的变体。 但似乎我不能像这样更新那个领域。

    $woocommerce_select = $_POST['_my_custom_field'];
    
    if( $woocommerce_select == 'sold_out' ) {
                   update_post_meta( $post_id, '_my_custom_field', esc_attr( $woocommerce_select ) );
                   update_post_meta( $post_id, '_stock_status', 'outofstock' );
    } else {
                   update_post_meta( $post_id, '_my_custom_field', esc_attr( $woocommerce_select ) );
    }
    

    不知道我在这里做错了什么,也许有人可以指点我。

    谢谢, 沫

    更新:添加了功能/挂钩:

    function woo_add_custom_general_fields_save( $post_id ){
    
    $woocommerce_select = $_POST['_my_custom_field'];
    
    if( !empty( $woocommerce_select ) ) {
           update_post_meta( $post_id, '_my_custom_field', esc_attr( $woocommerce_select ) );
           update_post_meta( $post_id, '_stock_status', 'outofstock' );
    }
    
    }
    add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save', 999 ); 
    

    我也尝试过较低或没有优先权。

    这就是我创建自定义字段的方式:

    function woo_add_custom_general_fields() {
    
    global $woocommerce, $post; ?>
    
    <div class="options_group">
            <p class="form-field custom_stock">
                <label for="custom_stock"><?php echo __( 'Custom Stock', 'aat-net-theme' ); ?></label>
                <span class="wrap">
                    <?php $custom_stock = get_post_meta( $post->ID, '_my_custom_field', true ); ?>  
                    <select id="custom_stock" name="_my_custom_field">
                        <option value="" <?php selected( $custom_stock, '' ); ?>> - Select Stock - </option>
                        <option value="new" <?php selected( $custom_stock, 'new' ); ?>>New</option>
                        <option value="in_stock" <?php selected( $custom_stock, 'in_stock' ); ?>>In Stock</option>
                        <option value="on_request" <?php selected( $custom_stock, 'on_request' ); ?>>On Request</option>
                        <option value="in_transit" <?php selected( $custom_stock, 'in_transit' ); ?>>In Transit</option>
                        <option value="not_available" <?php selected( $custom_stock, 'not_available' ); ?>>Not Available</option>
                    </select> 
                </span>
                <span class="description"><?php _e( 'Select the custom stock-status here.', 'aat-net-theme' ); ?></span>
            </p>
    
    <?php }
    add_action( 'woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields' );
    

1 个答案:

答案 0 :(得分:0)

也许这对其他人有帮助。

我尝试了很多不同的东西,在某些时候我停用了我的元框保存功能,字段仍然可以保存而没有问题。

我的问题似乎是使用2个默认的WooCommerce操作来创建和保存我的字段/元框。

add_action( 'woocommerce_process_product_meta'...

add_action( 'woocommerce_product_options_general_product_data'...

由于我找不到解决方案,我现在创建了一个正常的WordPress元框:

function lwsaat_custom_meta() {
    add_meta_box( 
        'lwsaat_meta', // HTML 'id' attribute of the edit screen section
        __( 'Heading', 'lwsaat-plugin' ), // Title of the edit screen section
        'lwsaat_meta_callback', // Function that prints out the HTML for the edit screen section
        'product', // The type of writing screen on which to show the edit screen section
        'normal', // The part of the page where the edit screen section should be shown ('normal', 'advanced', or 'side')
        'high' // The priority within the context where the boxes should show ('high', 'core', 'default' or 'low')
    );
}
add_action( 'add_meta_boxes', 'lwsaat_custom_meta' );

我创建了回调函数,如下所示:

function lwsaat_meta_callback( $post ) {

    wp_nonce_field( basename( __FILE__ ), 'lwsaat_nonce' );
    $lwsaat_stored_meta = get_post_meta( $post->ID );
    ?>

        <p class="form-field custom_stock">
            <label for="custom_stock"><?php echo __( 'Custom Stock', 'lwsaat-plugin' ); ?></label>
                <?php $custom_stock = $lwsaat_stored_meta['_aat_stock_select'][0]; ?>   
                <select id="custom_stock" name="_aat_stock_select">
                    <option value="new" <?php selected( $custom_stock, 'new' ); ?>>New</option>
                    <option value="in_stock" <?php selected( $custom_stock, 'in_stock' ); ?>>In Stock</option>
                    <option value="not_available" <?php selected( $custom_stock, 'not_available' ); ?>>Not Available</option>
                    <option value="eu_no_import" <?php selected( $custom_stock, 'eu_no_import' ); ?>>Import to EU not allowed</option>
                </select> 
        </p>
    <?php
}

保存功能如下:

function lwsaat_meta_save( $post_id ) {

    // Checks save status
    $is_autosave = wp_is_post_autosave( $post_id );
    $is_revision = wp_is_post_revision( $post_id );
    $is_valid_nonce = ( isset( $_POST[ 'lwsaat_nonce' ] ) && wp_verify_nonce( $_POST[ 'lwsaat_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false';

    // Exits script depending on save status
    if ( $is_autosave || $is_revision || !$is_valid_nonce ) {
        return;
    }


    // Save custom stock select
    $custom_stock = $_POST[ '_aat_stock_select' ];

    if( $custom_stock == 'new' ) {

        update_post_meta( $post_id, '_aat_stock_select', $_POST[ '_aat_stock_select' ] );
        update_post_meta( $post_id, '_stock_status', 'instock' );

    } elseif ( $custom_stock == 'not_available' ) {

        update_post_meta( $post_id, '_aat_stock_select', $_POST[ '_aat_stock_select' ] );
        update_post_meta( $post_id, '_stock_status', 'outofstock' );

    } else {
        update_post_meta( $post_id, '_aat_stock_select', $_POST[ '_aat_stock_select' ] );
    }
}
add_action( 'save_post', 'lwsaat_meta_save' );

使用此代码,我可以重新保存产品库存以及我的自定义字段。 使用原生WooCoommerce功能,我无法使用。