WooCommerce: добавьте поле ввода к каждому элементу в корзине
Я пытаюсь добавить одно текстовое поле ввода к каждому элементу в корзине и отправить этот пользовательский ввод в метаинформацию продукта. Это было 2 дня, и я еще не успел.
Моя цель:
- Взять данные от пользователя за каждый элемент, добавленный в корзину.
- Отобразить этот ввод в метаданных заказа.
- Отобразить этот ввод в электронном письме с подтверждением, отправленном клиенту.
До сих пор я скопировал файл шаблона в свою тему и добавил поле ввода внутри ячейки. У меня возникли проблемы с крючками, узнал о крючках, которые мне понадобятся из плагина WooCommerce Product Wrap, как показано в этом woocommerce вопрос.
Код, который я добавил в шаблон cart.php, скопированный в моем каталоге тем:
$input_url_data = '<div class="input-url"><input type="text" name="cart-url" value="" title="" class="input-text cart-url text" /></div>';
echo apply_filters( 'woocommerce_add_cart_item_data', $input_url_data, $cart_item_key );
Код, добавленный в мою тему functions.php:
add_filter( 'woocommerce_add_cart_item_data','add_cart_item_data', 10, 2 );
add_filter( 'woocommerce_get_cart_item_from_session','get_cart_item_from_session', 10, 2 );
add_filter( 'woocommerce_get_item_data','get_item_data', 10, 2 );
add_filter( 'woocommerce_add_cart_item','add_cart_item', 10, 1 );
add_action( 'woocommerce_add_order_item_meta','add_order_item_meta', 10, 2 );
function add_cart_item_data( $cart_item_meta, $product_id ) {
$input_url_key = "";
$input_url_data['inputurl'] = $input_url_key;
return $input_url_data;
}
function get_cart_item_from_session( $cart_item, $values ) {
if ( ! empty( $values['inputurl'] ) ) {
$cart_item['inputurl'] = true;
}
return $cart_item;
}
function get_item_data( $item_data, $cart_item ) {
if ( ! empty( $cart_item['inputurl'] ) )
$item_data[] = array(
);
return $item_data;
}
function add_cart_item( $cart_item ) {
if ( ! empty( $cart_item['inputurl'] ) ) {
}
return $cart_item;
}
function add_order_item_meta( $item_id, $cart_item ) {
if ( ! empty( $cart_item['inputurl'] ) )
woocommerce_add_order_item_meta( $item_id, __( 'URL by buyer', 'custom_input_url' ), __( 'Yes', 'custom_input_url' ) );
}
Документация о hook woocommerce_add_cart_item_data не очень полезна, и я застрял в этом. Как я могу продолжить?
Ответы
Ответ 1
Существует плагин wordpress, называемый WC Fields Factory для конкретной цели.
Вы также можете добиться этого, используя следующие крючки woocommerce woocommerce_before_add_to_cart_button
, woocommerce_add_to_cart
, woocommerce_cart_item_name
и 'woocommerce_add_order_item_meta'
как для добавления текстового поля к странице продукта
function add_name_on_tshirt_field() {
echo '<table class="variations" cellspacing="0">
<tbody>
<tr>
<td class="label"><label for="color">Name On T-Shirt</label></td>
<td class="value">
<input type="text" name="name-on-tshirt" value="" />
</td>
</tr>
</tbody>
</table>';
}
add_action( 'woocommerce_before_add_to_cart_button', 'add_name_on_tshirt_field' );
Для отображения пользовательского поля в таблице элементов корзины используйте ниже
function render_meta_on_cart_item( $title = null, $cart_item = null, $cart_item_key = null ) {
if( $cart_item_key && is_cart() ) {
echo $title. '<dl class="">
<dt class="">Name On T-Shirt : </dt>
<dd class=""><p>'. WC()->session->get( $cart_item_key.'_name_on_tshirt') .'</p></dd>
</dl>';
}else {
echo $title;
}
}
add_filter( 'woocommerce_cart_item_name', 'render_meta_on_cart_item', 1, 3 );
чтобы сделать ваши пользовательские метаданные в деталях заказа, сделайте что-нибудь вроде этого
function tshirt_order_meta_handler( $item_id, $values, $cart_item_key ) {
wc_add_order_item_meta( $item_id, "name_on_tshirt", WC()->session->get( $cart_item_key.'_name_on_tshirt') );
}
add_action( 'woocommerce_add_order_item_meta', 'tshirt_order_meta_handler', 1, 3 );
для детальной реализации, у меня есть статья о том, как это сделать без использования каких-либо плагинов. http://sarkware.com/how-to-pass-custom-data-to-cart-line-item-in-woocommerce-without-using-plugins/
Ответ 2
Это легко. Попробуйте найти и прочитать код Woocommerce.
Эта часть кода заставила меня указать, где я могу добавить Url @Cart. И я вижу это в обзоре заказов как клиент и как администратор.
Я не могу проверить электронную почту, потому что я ленив. Извините.
Что-то вроде этого идет в шаблонах \cart\cart.php(там нужен еще один код, поскольку он разделяет столбцы)
<td class="product-url">
<?php
$html = sprintf( '<div class="url"><input type="text" name="cart[%s][url]" value="%s" size="4" title="Url" class="input-text url text" /></div>', $cart_item_key, esc_attr( $values['url'] ) );
echo $html;
?>
</td>
functions.php
// get from session your URL variable and add it to item
add_filter('woocommerce_get_cart_item_from_session', 'cart_item_from_session', 99, 3);
function cart_item_from_session( $data, $values, $key ) {
$data['url'] = isset( $values['url'] ) ? $values['url'] : '';
return $data;
}
// this one does the same as woocommerce_update_cart_action() in plugins\woocommerce\woocommerce-functions.php
// but with your URL variable
// this might not be the best way but it works
add_action( 'init', 'update_cart_action', 9);
function update_cart_action() {
global $woocommerce;
if ( ( ! empty( $_POST['update_cart'] ) || ! empty( $_POST['proceed'] ) ) && $woocommerce->verify_nonce('cart')) {
$cart_totals = isset( $_POST['cart'] ) ? $_POST['cart'] : '';
if ( sizeof( $woocommerce->cart->get_cart() ) > 0 ) {
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
if ( isset( $cart_totals[ $cart_item_key ]['url'] ) ) {
$woocommerce->cart->cart_contents[ $cart_item_key ]['url'] = $cart_totals[ $cart_item_key ]['url'];
}
}
}
}
}
// this is in Order summary. It show Url variable under product name. Same place where Variations are shown.
add_filter( 'woocommerce_get_item_data', 'item_data', 10, 2 );
function item_data( $data, $cart_item ) {
if ( isset( $cart_item['url'] ) ) {
$data['url'] = array('name' => 'Url', 'value' => $cart_item['url']);
}
return $data;
}
// this adds Url as meta in Order for item
add_action ('woocommerce_add_order_item_meta', 'add_item_meta', 10, 2);
function add_item_meta( $item_id, $values ) {
woocommerce_add_order_item_meta( $item_id, 'Url', $values['url'] );
}
400 $- хорошая цена.
Ответ 3
Вы можете сделать это довольно легко с Плагин надстройки над дополнением Woocommerce
С веб-сайта WooThemes:
Позвольте своим клиентам настраивать ваши продукты, добавив новые параметры таких как окна ввода, выпадающие меню или флажки. С дополнениями к продукту продление, подарочные сообщения, пожертвования, лазерная гравировка и любые другие продукт, который может потребовать ввода пользователем каким-либо образом, теперь является опцией для ваши клиенты!
Надстройки продукта поддерживают обязательные поля, текстовые поля, флажки, радиостанций, блоков выбора, пользовательских ценовых входов и ящиков для загрузки файлов.
Я использовал его раньше, чтобы добавить дополнительное поле для пожертвования на покупку продукта и отобразить его на странице с благодарностью/электронной почтой.
Это около 50 долларов США, и вы сможете быстро и быстро запускать ввод текста и отображать поле на странице благодарности или электронной почте, как вы хотите. $50 определенно стоит того времени, которое вы бы спасли, чтобы самостоятельно разработать эту функцию.
Здесь поток с точки зрения конечных пользователей:
Конечный пользователь вводит данные поля и добавляет продукт в корзину
![End User enters in field data and adds product to cart]()
Когда пользователь просматривает корзину, данные, которые они ввели в пользовательское поле, отображаются вместе с продуктом
![When User views cart the data they entered into the custom field displays along with the product]()
После покупки, конечный пользователь приземляется на странице благодарности и получает письмо о получении с данными поля, включенными в товарный элемент.
![After purchase, end user lands on thank you page and receives receipt email with field data included with the product item.]()
На сервере:
Создайте настраиваемое поле для каждого продукта. Этот параметр находится на вкладке меню надстройки.
- Создайте новую группу Addon
- Введите название группы (для упрощения организации)
- Добавить новую опцию и ввести метку (это то, что конечный пользователь видит и привязан к продукту)
- Обновить/опубликовать продукт.
![Create custom field for each product]()
Для выполненных заказов это то, что вы увидите в описании заказа admin:
![product order details page also displays the field]()
Надеемся, что это поможет и сэкономит вам массу времени в разработке!