Наверх

Добавление кастомного поля к товару Woocommerce на примере номера складской ячейки или коробки

Woocommerce предоставляет отличную возможность создать интернет-магазин чего угодно на базе WordPress с минимальными навыками разработки или даже вообще без них. В нем даже предусмотрен механизм добавления так называемых "атрибутов", то есть дополнительных полей, расширяющих возможности классификации товаров.

Однако эти атрибуты ориентированы больше на показ на клиентской части, т.е. размеры, цвета, фасон и т. д. А что если нужно создать характеристику только для внутреннего использования? Например, номер складской ячейки или коробки, в которой хранятся нужные товары.

В этой статье я рассматриваю создание числового поля для номера коробки, его вывод в таблицу товаров для удобного поиска и вывод на странице редактирования заказа с возможностью сортировки.

1. Добавление поля к товару Woocommerce

Добавим в файл functions.php вашей дочерней темы две функции - чтение нового параметра и его запись. Если у вас еще нет дочерней темы, создайте ее сейчас, не правьте файлы основной темы или плагинов, поскольку ближайшее обновление удалит все изменения безвозвратно.

// Добавление поля на вкладку "Основное"
add_action( 'woocommerce_product_options_general_product_data', 'add_custom_option_to_products');
function add_custom_option_to_products(){
  global $post, $product;
  woocommerce_wp_text_input( array(
    'id' => '_box_number',
    'label' => __( 'Номер коробки', 'woocommerce' ),
    'placeholder' => '',
    'desc_tip' => 'true',
    'description' => __( 'Где хранятся товары', 'woocommerce' ),
    'value' => get_post_meta( $post->ID, '_box_number', true ),
  ));
}

Этот код создаст поле на вкладке "Основное". Если хотите выводить его на вкладке "Доставка", замените woocommerce_product_options_general_product_data на woocommerce_product_options_shipping_product_data

Следующей функцией запишем изменения в базу:

// Если пользователь изменил поле, сохраняем его
add_action( 'woocommerce_process_product_meta', 'save_custom_general_option_to_products' );
function save_custom_general_option_to_products( $product_id ){
  $box_number = $_POST['_box_number'];
  if( isset( $box_number ) ){
    update_post_meta( $product_id, '_box_number', esc_attr( $box_number ) );
  }
}

2. Номер ячейки в списке товаров

Выведем номер складской ячейки / коробки в общем списке товаров:

add_filter( 'manage_edit-product_columns', 'woocommerce_admin_products_box_column', 9999 );
function woocommerce_admin_products_box_column( $columns ){
  return array_slice( $columns, 0, 6, true ) + array( 'box' => 'Номер коробки' ) + array_slice( $columns, 6, count( $columns ) - 6, true );
}

add_action( 'manage_product_posts_custom_column', 'woocommerce_admin_products_box_column_content', 10, 2 );
function woocommerce_admin_products_box_column_content( $column, $product_id ){
  if ( $column == 'box' ) {
    echo absint(get_post_meta($product_id, '_box_number', 1)); 
  }
}

Благодаря методу absint пустые значения конвертируются в 0. Если ваш номер коробки не числовой, уберите absint().

Если вам нужно разместить колонку в другом месте, просто замените все вхождения 6 в код на желаемый номер колонки.

3. Вывод номера коробки на странице заказа

На странице редактирования заказа добавим сортируемый столбец с номером коробки, чтобы сборщику было удобнее.

add_action( 'woocommerce_admin_order_item_headers', 'custom_admin_order_items_headers', 20, 1 );
function custom_admin_order_items_headers( $order ){
  echo '<th class="item_box sortable" data-sort="int">';
  echo __('Коробка №', 'woocommerce') . '</th>';
}

add_action( 'woocommerce_admin_order_item_values', 'custom_admin_order_item_values', 20, 3 );
function custom_admin_order_item_values( $_product, $item, $item_id ) {
  if ($_product){ 
    $product_id = $_product->get_id(); 
    $box_number = absint(get_post_meta($product_id, '_box_number', 1)); 
  } 
  if ($box_number){
    echo '<td>' . $box_number . '</td>';
  }
  else {
    echo '<td><small>0</small></td>';
  }
}

Если ваш номер ячейки не цифровой, как в примере, замените data-sort="int" на желаемое значение и удалите absint().

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *