В связи с растущими потребностями к функционалу интернет-магазинов будем создавать востребованный функционал на базе плагина Woocommerce.
Единица измерения товара
Если необходимо выводить единицу товара (шт, кв.м, упаковка, пог.м, и т.д.), сделаем metabox для данного значения, в вкладке Woocommerce Основные. Поле можно задать текстовым или сделать список из вариантов.
Список из вариантов
add_action( 'woocommerce_product_options_shipping_product_data', 'woo_add_custom_general_fields' ); add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save' ); function woo_add_custom_general_fields() { global $woocommerce, $post; echo '<div class="options_group">'; // Add Select field in woocommerce woocommerce_wp_select( array( 'id' => '_select', 'label' => __( 'Единица измерения', 'productunit' ), 'options' => array( 'шт' => __( 'шт', 'productunit' ), 'пачка' => __( 'пачка', 'productunit' ), 'кв.м' => __( 'кв.м', 'productunit' ) ) ) ); echo '</div>'; }
Текстовое поле — Единица
add_action( 'woocommerce_product_options_shipping_product_data', 'woo_add_custom_general_fields' ); add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save' ); function woo_add_custom_general_fields() { global $woocommerce, $post; echo '<div class="options_group">'; // Add Text field in woocommerce woocommerce_wp_text_input( array( 'id' => '_text_field', 'label' => __( 'My Text Field', 'woocommerce' ), 'placeholder' => 'http://', 'desc_tip' => 'true', 'description' => __( 'Enter the custom value here.', 'woocommerce' ) ) ); echo '</div>';}
Добавляем функцию сохранения значения (в зависимости от выбора реализации списком или текстом удаляем лишнее).
function woo_add_custom_general_fields_save( $post_id ){ // Text Field $woocommerce_text_field = $_POST['_text_field']; if( !empty( $woocommerce_text_field ) ) update_post_meta( $post_id, '_text_field', esc_attr( $woocommerce_text_field ) ); // Select $woocommerce_select = $_POST['_select']; if( !empty( $woocommerce_select ) ) update_post_meta( $post_id, '_select', esc_attr( $woocommerce_select ) ); }
Единица товара после цены
Создаем функцию привязки единицы измерения к цене.
add_filter( 'woocommerce_cart_product_price' , 'custom_price', 10, 2); add_filter( 'woocommerce_get_price_html' , 'custom_price', 10, 2); function custom_price( $price, WC_Product $product ){ $unit = get_post_meta( $product->get_ID(), '_select', true ); if ($unit) { $price .= '<span class="woocommerce-Price-amount amount"><span class="product price amount rubl">'; $price .= ' / ' ; $price .= $unit; $price .= '</span></span>'; } return $price; }
28.04.18 В интерфейс массового редактирования можно добавлять и пользовательские поля. Но для различных случаев возможно и использование с помощью атрибута.
Единица измерения в виде атрибута
Немного меняем предыдущую функцию. pa_klass-zashhityi — slug нужного атрибута
function custom_price( $price, WC_Product $product ){ if (get_the_terms( $post->ID , 'pa_klass-zashhityi')) { $units = get_the_terms( $post->ID , 'pa_klass-zashhityi'); foreach( $units as $unit ){ echo $unit->name; } $price .= '<span class="woocommerce-Price-amount amount"><span class="product price amount rubl">'; $price .= ' / ' ; $price .= $unit->name; $price .= '</span></span>'; } return $price; }
Обновленная (более короткая) функция прибавления к цене:
function custom_price( $price ){
global $post;
$unit = wp_get_object_terms($post->ID, 'pa_unit');
if (!empty($unit)) {
$price .= '';
$price .= ' / ' ;
$price .= $unit[0]->name;
$price .= '</span></span>';
}
return $price;
}
Я не понял куда это вставлять?
Это все функции. Вставлять можно в functions.php, либо подключить к functions отдельный файл с функциями woocommerce (я так делаю), либо можно сделать плагином.
добавил код из первого блока в function.php, который лежит в паке wp-includes, ни чего не происходит, может я туплю))) что то ведь еще нужно где то добавить, в файле php который выводит страницу настройки товара в админке?
Вы не туда добавили. Вставлять надо в файл functions который находится в папке темы (site.ru/wp-content/themes/ваша_тема/functions.php). Если добавить только первый абзац ничего и не добавится. Первый и второй абзацы это варианты типов полей (текстовым и списком), далее надо добавить функцию сохранения поля и еще одна функция привязки нового поля к выводимой цене. В шаблонах WC редактировать ничего не нужно — все работает на хуках.
Александр, спасибо за ответы! Добавил вот такой код в function.php, который лежит в папке моего шаблона, шаблон у меня ColorMag
add_action( ‘woocommerce_product_options_shipping_product_data’, ‘woo_add_custom_general_fields’ );
add_action( ‘woocommerce_process_product_meta’, ‘woo_add_custom_general_fields_save’ );
function woo_add_custom_general_fields() {
global $woocommerce, $post;
echo »;
// Add Select field in woocommerce
woocommerce_wp_select(
array(
‘id’ => ‘_select’,
‘label’ => __( ‘Единица измерения’, ‘productunit’ ),
‘options’ => array(
‘шт’ => __( ‘шт’, ‘productunit’ ),
‘пачка’ => __( ‘пачка’, ‘productunit’ ),
‘кв.м’ => __( ‘кв.м’, ‘productunit’ )
)
)
);
echo »; }
function woo_add_custom_general_fields_save( $post_id ){
// Select
$woocommerce_select = $_POST[‘_select’];
if( !empty( $woocommerce_select ) )
update_post_meta( $post_id, ‘_select’, esc_attr( $woocommerce_select ) );
}
add_filter( ‘woocommerce_cart_product_price’ , ‘custom_price’, 10, 2);
add_filter( ‘woocommerce_get_price_html’ , ‘custom_price’, 10, 2);
function custom_price( $price, WC_Product $product ){
if (get_post_meta( $product->id, ‘_select’, true )) {
$unit = get_post_meta( $product->id, ‘_select’, true );
$price .= »;
$price .= ‘ / ‘ ;
$price .= $unit;
$price .= »;
}
return $price;
}
К сожалению ни чего не изменилось((
А в товаре у вас должно появилось нового поля (select). Заполните его для какого-либо товара, и тогда единица выведется после цены. Если поле не заполнено — ничего не выводится..
У меня тоже не работает.
Напрягает еще вот эта строка function custom_price( $price, WC_Product $product ), а именно WC_Product $product. Почему тут пробел?
Сама запись такого вида
function custom_price( $price, WC_Product $product )
у меня работает корректно.
По поводу того что не работает — попробуйте на промежуточных этапах «прозвонить» функции. На каком моменте не работает?!
У вас в функции привязки единицы измерения к цене производится двойной запрос к базе данных:
if (get_post_meta( $product->get_ID(), '_select', true )) {
$unit = get_post_meta( $product->get_ID(), '_select', true );
Лучше вот так:
$unit = get_post_meta( $product->get_ID(), '_select', true );
if ($unit) {
}
Вы абсолютно правы. Спасибо!
Изменил функцию в посте.
Спасибо большое! долго искал это. все работает!!! делал через атрибуты. для тех кто, как я, не очень в программировании нужно вставить functions.php темы:
add_filter( ‘woocommerce_cart_product_price’ , ‘custom_price’, 10, 2);add_filter( ‘woocommerce_get_price_html’ , ‘custom_price’, 10, 2);function custom_price( $price ){ global $post; $unit = wp_get_object_terms($post->ID, ‘pa_edinitsa-izmereniya’); if (!empty($unit)) { $price .= »; $price .= ‘ / ‘ ; $price .= $unit[0]->name; $price .= ‘</span></span>’; } return $price;}
Ничего нигде не добавляется…
Не работает выдаёт Fatal error: Cannot redeclare woo_add_custom_general_fields()
Данная ошибка означает что функция woo_add_custom_general_fields() уже где-то объявлена. т.е. вы её прописали повторно.