Наверх

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

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

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

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

1. Добавление поля

Добавим в файл 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 не будет опубликован. Обязательные поля помечены *