Как получить ID вариации WooCommerce?

14 янв. 2014 г., 19:44:48
Просмотры: 27.1K
Голосов: 3

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

Вот с чем я работаю:

<?php
        // Получаем вариации
        $args = array(
                     'post_type'     => 'product_variation',
                     'post_status'   => array( 'private', 'publish' ),
                     'numberposts'   => -1,
                     'orderby'       => 'menu_order',
                     'order'         => 'asc',
                     'post_parent'   => $post->ID
                 );
                 $variations = get_posts( $args ); 

        foreach ( $variations as $variation ) {
                     $variation_id           = absint( $variation->ID );$variable_id = $this['variation_id'];
                     $variation_post_status  = esc_attr( $variation->post_status );
                     $variation_data         = get_post_meta( $variation_id );
                     $variation_data['variation_post_id'] = $variation_id;
                    echo get_post_meta( $variation_data['variation_post_id'], '_my_custom_field', true) . ' - TEST';
                 }
     ?>

Когда я проверяю административную панель, похоже, что она загружает все мета-данные в каждую вариацию следующим образом:

описание изображения

Однако если я использую фактический ID вариации, как показано ниже, то это работает для этой вариации:

echo get_post_meta( 134, '_my_custom_field', true) . ' - Test Variation #134';


ОБНОВЛЕНИЕ:
Вот весь код полностью, если это поможет.

// Отображение полей
add_action( 'woocommerce_product_after_variable_attributes', 'variable_fields' );
// JS для добавления полей для новых вариаций
add_action( 'woocommerce_product_after_variable_attributes_js', 'variable_fields_js' );
// Сохранение полей
add_action( 'woocommerce_process_product_meta_variable', 'variable_fields_process', 10, 1 );

function variable_fields( $loop, $variation_data, $variation ) {
?>  
    <tr>
        <td>
            <div>
                    <label><?php _e( 'My Custom Field', 'woocommerce' ); ?></label>
                    <input type="text" size="5" name="my_custom_field[<?php echo $loop; ?>]" value="<?php echo $variation_data['_my_custom_field'][0]; ?>"/>

      <?php
      if (isset( $_POST['variable_sku'] ) ) :
        $variable_sku = $_POST['variable_sku'];
        $variable_post_id = $_POST['variable_post_id'];
        $variable_custom_field = $_POST['my_custom_field'];
        for ( $i = 0; $i < sizeof( $variable_sku ); $i++ ) :
            $variation_id = (int) $variable_post_id[$i];
            if ( isset( $variable_custom_field[$i] ) ) {
                update_post_meta( $variation_id, '_my_custom_field', stripslashes( $variable_custom_field[$i] ) );
            }
            echo get_post_meta( $variation_id, '_my_custom_field', true) . ' - Test';
        endfor;
    endif;

        //работает echo get_post_meta( 134, '_my_custom_field', true) . ' - Test 134';

     ?>
            </div>
        </td>
    </tr>
<?php
}

function variable_fields_js() {
?>
<tr>
        <td>
            <div>
                    <label><?php _e( 'My Custom Field', 'woocommerce' ); ?></label>
                    <input type="text" size="5" name="my_custom_field[' + loop + ']" />
            </div>
        </td>
    </tr>
<?php
}

function variable_fields_process( $post_id ) {
    if (isset( $_POST['variable_sku'] ) ) :
        $variable_sku = $_POST['variable_sku'];
        $variable_post_id = $_POST['variable_post_id'];
        $variable_custom_field = $_POST['my_custom_field'];
        for ( $i = 0; $i < sizeof( $variable_sku ); $i++ ) :
            $variation_id = (int) $variable_post_id[$i];
            if ( isset( $variable_custom_field[$i] ) ) {
                update_post_meta( $variation_id, '_my_custom_field', stripslashes( $variable_custom_field[$i] ) );
            }
        endfor;
    endif;
}
Комментарии

Какой контекст? На какой позиции вам нужно получить variation_id? Чтобы добавить ваше поле, вы используете хук woocommerce_product_after_variable_attributes или что-то другое?

Shazzad Shazzad
15 янв. 2014 г. 02:49:37

Спасибо @Shazzad, я обновил вопрос, чтобы показать весь мой код. Да, я использовал этот хук. Спасибо за вашу помощь.

Derek Derek
15 янв. 2014 г. 16:24:28

Третий аргумент $variation - это объект записи, который содержит ID, например $variation->ID. Также массив $variation_data содержит ID $variation_data['variation_post_id']. Для обновления значений в метаданных вы можете использовать хук woocommerce_save_product_variation, который принимает два аргумента: $variation_id и $i (индекс/номер).

Shazzad Shazzad
15 янв. 2014 г. 23:57:33

Когда я пытаюсь изменить get_post_meta на $variation->ID, то ничего не выводится на странице редактирования товара в админке. Не могли бы вы привести пример (я лучше воспринимаю визуально), где я могу увидеть и протестировать это?

Derek Derek
16 янв. 2014 г. 04:17:03

Хорошо, я помогу, но я немного запутался в том, чего вы пытаетесь добиться. Не могли бы вы объяснить, чтобы я мог попытаться помочь?

Shazzad Shazzad
16 янв. 2014 г. 07:35:41

Мне просто нужен способ получить ID вариации при использовании функции get_post_meta. Как видно на скриншоте, у меня есть пользовательское мета-поле внизу каждой вариации, куда можно ввести информацию. Данные сохраняются в базу без проблем, но получение ID вариации для get_post_meta - это моя проблема. Сейчас, если вы введете что-либо в любое из этих полей и нажмете "Обновить", данные сохранятся, но не отобразятся в текстовом поле, как видно на скриншоте выше. Например, я ввел "opiolik" в первое мета-поле вариации и "qefqe" во второе.

Derek Derek
16 янв. 2014 г. 15:13:21

Итак, моя проблема заключается в том, что $variation_id на самом деле не извлекает ID вариации в 'echo get_post_meta( $variation_id, '_my_custom_field', true) . ' - Test';', а вместо этого показывает все метаданные вариации, как на скриншоте для каждого варианта. Если я использую что-то вроде echo get_post_meta( 134, '_my_custom_field', true) . ' - Test';', то это работает и показывает метаданные _my_custom_field для вариации #134. Надеюсь, я вас не запутал. Короче говоря, мне просто нужен способ показать данные, которые были введены после нажатия кнопки "Обновить". (Данные сохраняются в базе данных, но не отображаются при обновлении страницы)

Derek Derek
16 янв. 2014 г. 15:17:11

Попробуйте вот это: <input type="text" size="5" name="my_custom_field[<?php echo $loop; ?>]" value="<?php echo get_post_meta( $variation->ID, '_my_custom_field', true ); ?>"/>

Shazzad Shazzad
17 янв. 2014 г. 00:27:22

Эх, это тоже не сработало... Я ввожу данные в текстовое поле, нажимаю "Сохранить", но они всё равно не отображаются. Есть ещё идеи? (P.S. Огромное спасибо за помощь!)

Derek Derek
17 янв. 2014 г. 02:36:59

Пожалуйста, избегайте длинных обсуждений в комментариях. Если вам нужно что-то уточнить, отправьте [правку] вместо комментария. @Shazzad Если у вас есть решение, пожалуйста, опубликуйте его как ответ, а не как комментарий. Спасибо.

kaiser kaiser
10 февр. 2014 г. 20:23:34
Показать остальные 5 комментариев