Обновить настраиваемое поле другим настраиваемым полем

Я работаю с множеством custom_fields в WordPress.

В настоящее время я работаю с WooCommerce, я точно не знаю, связан ли мой вопрос с WP или просто с Woo.

У меня есть одна настройка настраиваемого поля в качестве поля выбора. Я могу выбирать между несколькими предметами, такими как:

  1. новый
  2. в наличии
  3. распроданный

Когда я выбираю «sold_out» и сохраняю публикацию / продукт, я не только хочу сохранить это поле, но также хочу установить для «_stock_status» значение «outofstock».

Поле «_stock_status» является полем WooCommerce по умолчанию. Это также раскрывающийся список. Вы можете выбрать значения «на складе» или «на складе».

Дело в том, что я работаю с функцией сохранения 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' );

person LWS-Mo    schedule 10.06.2015    source источник
comment
можешь показать мне крючок? .   -  person Arsh Singh    schedule 10.06.2015


Ответы (1)


может быть, это будет полезно для кого-то другого.

Я пробовал много разных вещей, в какой-то момент я отключил функцию сохранения метабокса, и поля все равно сохранялись без проблем.

Похоже, что моя проблема была вызвана использованием двух действий 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.

person LWS-Mo    schedule 19.06.2015