web-dev-qa-db-ja.com

WooCommerce:カート内のすべてのアイテムに入力フィールドを追加します

私は、カート内のすべてのアイテムに単一のテキスト入力フィールドを追加し、そのユーザー入力を製品のメタ情報に送信しようとしています。 2日が経ちましたが、まだ成功していません。

私の目的は:

  1. カートに追加されたすべてのアイテムについてユーザーからの入力を受け取ります。
  2. その入力を注文のメタ情報に表示します。
  3. 顧客に送信される確認メールでその入力を表示します。

これまで、テンプレートファイルをテーマにコピーし、セル内に入力フィールドを追加しました。フックに問題があります。必要なフックについては、 WooCommerce Product Gift Wrap プラグインに示されているプラ​​グイン woocommerce issue から学びました。

テーマディレクトリにコピーした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' ) );
}

フックwoocommerce_add_cart_item_dataに関するドキュメントはあまり役に立たず、私はこれで立ち往生しています。どうすればいいですか?

21
Nix

wordpress WC Fields Factory というプラグインがあり、正確な目的のためにあります。

次のwoocommerceフックを使用してこれを実現することもできますwoocommerce_before_add_to_cart_buttonwoocommerce_add_to_cartwoocommerce_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/

20
Sark

それは簡単です。 Woocommerceのコードを検索して読んでみてください。

この多くのコードにより、Url @ Cartを追加できる場所が示されました。そして、注文レビューで顧客および管理者として確認できます。

怠け者なので、メールをテストできません。申し訳ありません。

このようなものはtemplates\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 $はナイス価格です。

7
ViszinisA

Woocommerce Product Add-onsプラグイン を使用すると、これをかなり簡単に行うことができます。

WooThemes Webサイトから:

入力ボックス、ドロップダウン、チェックボックスなどの新しいオプションを追加して、顧客が製品をカスタマイズできるようにします。製品アドオン拡張機能を使用すると、ギフトメッセージ、寄付、レーザー彫刻など、何らかの方法でユーザーの入力を必要とする可能性のあるその他の製品がお客様の選択肢になります。

製品アドオンは、必須フィールド、テキストエリア、チェックボックス、ラジオ、選択ボックス、カスタム価格入力、ファイルアップロードボックスをサポートしています。

以前にそれを使用して、製品購入に追加の寄付フィールドを追加し、それをサンキューページ/領収書メールに表示しました。

約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.

バックエンドで:

製品ごとにカスタムフィールドを作成します。このオプションは、[アドオン]メニュータブにあります。

  1. 新しいアドオングループを作成する
  2. グループ名を入力します(整理しやすいように)
  3. 新しいオプションを追加してラベルを入力します(これはエンドユーザーに表示され、製品に関連付けられています)
  4. 製品の更新/公開。

Create custom field for each product

完了した注文の場合、これは注文詳細管理に表示されます。

product order details page also displays the field

これがあなたの開発に多大な時間と助けになることを願っています!

0
Ian