Произвольные поля в WooCommerce

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

Мы начнем с добавления произвольного поля на вкладку Общие на странице редактирования товара в WooCommerce под полем «Обычная цена», где вы сможете ввести значения и сохранить их, продолжим работу по сохранению и проверки данных, а затем вывода этих данных на странице товара уже на клиентской части вашего магазина.

В качестве примера мы покажем как добавить поле «Рекомендованная розничная цена» (РРЦ) к товару в WooCommerce и вывести ее на сайте, и, давайте уже начнем.

Первым делом мы определим поле на странице редактирования товара, к счастью WooCommerce позволяет это реализовать крайне просто с помощью огромного количества доступных хуков и встроенный функционал генерации HTML полей для ввода. Вставьте следующий код в файл functions.php вашей темы или в плагин для сайта WordPress для того, чтобы определить новое текстовое поле на странице редактирования товара:

add_action( 'woocommerce_product_options_pricing', 'wc_rrp_product_field' );
function wc_rrp_product_field() {
woocommerce_wp_text_input( array( 'id' => 'rrp_price', 'class' => 'wc_input_price short', 'label' => __( 'РРЦ', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')' ) );
}

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

add_action( 'save_post', 'wc_rrp_save_product' );
function wc_rrp_save_product( $product_id ) {
// Если это автосохранение, то ничего не делаем, сохраняем данные только при нажатии на кнопку Обновить
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( isset( $_POST['rrp_price'] ) ) {
if ( is_numeric( $_POST['rrp_price'] ) )
update_post_meta( $product_id, 'rrp_price', $_POST['rrp_price'] );
} else delete_post_meta( $product_id, 'rrp_price' );
}

Теперь, когда вы введете значение в поле РРЦ («Рекомендованная розничная цена») и обновите товар, поле должно сохраниться и отобразиться в этом же поле при повторной загрузке страницы. Последним нашим шагом будет вывод значения, сохраненного на странице товара на сайт на обозрение покупателей, и для этого добавьте следующий код в файл functions.php вашей темы:

add_action( 'woocommerce_single_product_summary', 'wc_rrp_show', 5 );
function wc_rrp_show() {
global $product;
// Ничего не предпринимаем для вариативных товаров
if ( $product->product_type <> 'variable' ) {
$rrp = get_post_meta( $product->id, 'rrp_price', true );
echo '<div class="woocommerce_msrp">';
_e( 'РРЦ : ', 'woocommerce' );
echo '<span class="woocommerce-rrp-price">' . woocommerce_price( $rrp ) . '</span>';
echo '</div>';
}
}
 
// Дополнительно: Для вывода на страницах архивов (в товарных категориях, например)
add_action( 'woocommerce_after_shop_loop_item_title', 'wc_rrp_show' );

Конечный результат будет выглядеть примерно как на картинке ниже, когда вы будете добавлять или редактировать товар:

woocommerce_custom_field_edit_product[1]

А вот так будет выглядеть это поле для конечного покупателя при просмотре карточки товара:

woocommerce_custom_field_frontend[1]

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

По всем вопросам и отзывам просьба писать в комментарии ниже.

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

VN:F [1.9.22_1171]
Rating: 4.3/5 (15 votes cast)

Об авторе ADv

Занимаюсь разработкой сайтов и магазинов на WordPress. Оказываю платные помощь и консультации. Skype: advokat_b
  • Сергей

    А как добавить поле, только тип Дата?

    • Рем Че

      add_action( ‘woocommerce_product_options_general_product_data’, ‘wc_rooms_product_field’ );

      function wc_rooms_product_field() {

      woocommerce_wp_text_input( array( ‘id’ => ‘rooms’, ‘class’ => ‘wc_input_args short’, ‘label’ => __( ‘Площадь’, ‘woocommerce’ ) . ‘ ‘ ) );

      }

      add_action( ‘save_post’, ‘wc_rooms_save_product’ );

      function wc_rooms_save_product( $product_id ) {

      // Если это автосохранение, то ничего не делаем, сохраняем данные только при нажатии на кнопку Обновить

      if ( defined( ‘DOING_AUTOSAVE’ ) && DOING_AUTOSAVE ) return;

      if ( isset( $_POST[‘rooms’] ) ) { update_post_meta( $product_id, ‘rooms’, $_POST[‘rooms’] );

      } else delete_post_meta( $product_id, ‘rooms’ );

      }

      add_action( ‘woocommerce_single_product_summary’, ‘wc_rooms_show’, 15 );

      function wc_rooms_show() { global $product;

      // Ничего не предпринимаем для вариативных товаров

      if ( $product->product_type ‘variable’ ) {$rooms = get_post_meta( $product->id, ‘rooms’, true );

      echo ‘  ‘;

      _e( ‘Площадь: ‘, ‘woocommerce’ );

      echo » . woocommerce_clean( $rooms ) . »;

      echo »;

      }

      }

      add_action( ‘woocommerce_after_shop_loop_item_title’, ‘wc_rooms_show’ );

    • Рем Че

      убрана проверка на только цифры, а так все тоже самое

  • Евгений Онегин

    Добрый день, отличное решение, но хотелось бы решить в нем один момент:

    Проблема появляется когда есть товар, которому уже задали «Рекомендованную розничную цену» (или «Оптовую цену» если мы отредактировали вывод) к примеру 150 руб, но у товара уже нет рекомендуемой цены.
    При попытке удалить значение цены в кастомном поле ниечего не выйдет так, не будет пройдена проверка

    if ( isset( $_POST[‘rrp_price’] ) ) {
    if ( is_numeric( $_POST[‘rrp_price’] ) )
    update_post_meta( $product_id, ‘rrp_price’, $_POST[‘rrp_price’] );
    } else delete_post_meta( $product_id, ‘rrp_price’ );
    }

    И при пустом поле «Рекомендуемой розничной цены» на странице редактировании товара, будет выводится последнее значение, в нашем примере 150 руб. на странице товара.

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

    Буду вам весьма благодарен.

    • Кирилл

      Тоже столкнулся с этой проблемой. Просто так введенное значение не удалить, только если заменить на нолик, но это не везде подойдет. Но, здесь вам не ответят, они же просто копируют и вставляют код.

  • Ика

    А как добавить выпадающий список с выбором размера, например, и что в корзине отображался и в письме заказа отправлялся, может у вас есть статья?

    • ADv

      Добавьте соответствующие свойства товару. Они отобразятся и в карточке товара, и в корзине. Насчет выпадающего списка не уверен, возможно это уже «зашито» в вашей теме..

  • Саша

    http://gerhardpotgieter.com/2013/09/17/woocommerce-custom-product-fields/ та же статья, но по английски, с большим количеством интересных комментариев.

  • Юрий Суржик

    День добрый! Спасибо еще раз за статью. Подскажите ,если возможно , как через произвольное поле вывести цену дополнительно в другой валюте и задать курс. Низкий Вам поклон ,ПОМОГИТЕ !

    • ADv

      Вряд ли это удобно и быстро получится реализовать произвольными полями. Посмотрите лучше в сторону плагинов, вроде WordPress — WooCommerce Currency Switcher http://codecanyon.net/item/woocommerce-currency-switcher/8085217

      • Promkomplekt Promkomplekt

        спасибо!!!!!!!!

  • Валодя

    Подскажите как сделать вывод картинки не миниатюры а из произвольного поля, весь плагин перелопатил и
    /**
    * Get the placeholder image
    *
    * @access public
    * @return string
    */
    function wc_placeholder_img( $size = ‘shop_thumbnail’ ) {
    $dimensions = wc_get_image_size( $size );

    return apply_filters(‘woocommerce_placeholder_img’, », $size, $dimensions );
    }

    заменив return на get_post_meta($post->ID, ‘img’, $single = true); не выводится

    адрес изображения

  • Игорь

    Добрый день!
    У меня на сайте много категорий товаров.
    И сейчас возникла необходимость выводить можно из категорий товаров совсем по-другому.
    Например:
    Категория товаров «Женская одежда»: на странице артикула выводится таблица женских размеров.

    На артикулах «мужская одежда» выводится таблица мужских размеров.

    На страницах категории бейджи: выводиться форма создания бейджа с возможностью заказать созданный бейдж. Как я могу это сделать? Уже весь интернет облазил не могу решить проблему….

  • Алексей Орлик

    Скажите, а можно ли вводить текстовое поле (textarea) а не input ??

  • Микаил

    Отличная статья! Спасибо выручил.

  • Александр

    Подскажите, почему на страницах WooCommerce (Shop, Cart и тд) не работают стандартные произвольные поля WordPress и даже те, что добавляются через плагины разного рода. Т.е произвольно поле работает везде (выводит данные), кроме страницы от WooCommerce.

  • Ivan Trubchaninov

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

  • Svitlana Tsybulya

    Продолжение будет? Для вариативных и сгруппированных товаров?

Scroll To Top