Добавление кастомного поля к товару 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().