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().