Подтвердить что ты не робот

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 не очень полезна, и я застрял в этом. Как я могу продолжить?

4b9b3361

Ответ 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

Надеемся, что это поможет и сэкономит вам массу времени в разработке!