WooCommerce:向购物车中的每个项目添加输入字段

2024-03-27

我一直在尝试向购物车中的每个项目添加一个文本输入字段,并将用户输入提交到产品的元信息。已经2天了,我还没有成功。

我的目标是:

  1. 获取用户对添加到购物车中的每件商品的输入。
  2. 在订单的元信息中显示该输入。
  3. 在发送给客户的确认电子邮件中显示该输入。

到目前为止,我已将模板文件复制到我的主题中,并在单元格内添加了一个输入字段。我在使用钩子时遇到了麻烦,从中了解了我需要的钩子WooCommerce 产品礼品包装 http://wordpress.org/plugins/woocommerce-product-gift-wrap/插件如此所示woocommerce 问题 https://github.com/woothemes/woocommerce/issues/2105.

我添加到在我的主题目录中复制的 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 的文档不是很有帮助,我陷入了困境。我该如何继续?


有一个wordpress插件叫WC 菲尔德工厂 https://wordpress.org/plugins/wc-fields-factory/出于确切的目的,但对于手动代码:

2023年更新:自从这个答案以来,woocommerce 发生了一些变化。您现在可以使用以下代码添加一个名为的字段field1添加到购物车之前到您的产品页面,并将其显示在thank you and admin order details (edit order) page :

// add field field1 before add to cart
function upfx_add_addtocart_field1() {
  echo '
  <style>
    .kt-addtocart-field1{
      padding: 8px 8px;
      font-size: 16px;
    }
    .kt-addtocart-field1-label{
      display: inline-block;
      min-width: 90px;
    }
    .kt-addtocart-field1-container{
      margin: 10px 0;
    }
  </style>
  <div class="kt-addtocart-field1-container">
    <label for="kt-addtocart-field1" class="kt-addtocart-field1-label">field1 :</label>
    <input type="text" name="kt-addtocart-field1" id="kt-addtocart-field1" class="kt-addtocart-field1" value="" />
  </div>';
}
add_action( 'woocommerce_before_add_to_cart_button', 'upfx_add_addtocart_field1' );

// field1 is required (validation)
function upfx_vadilate_cartitem_field1() { 
    if ( empty( $_REQUEST['kt-addtocart-field1'] ) ) {
        wc_add_notice( __( 'Please enter a value for field1.', 'woocommerce' ), 'error' );
        return false;
    }
    return true;
}
add_action( 'woocommerce_add_to_cart_validation', 'upfx_vadilate_cartitem_field1', 10, 3 );

// save field1 for cart item when adding to card
add_filter( 'woocommerce_add_cart_item_data', 'upfx_save_custom_fields_data_to_cart_for_field1', 10, 2 );
function upfx_save_custom_fields_data_to_cart_for_field1( $cart_item_data, $product_id ) {
    $data = array();
    if(isset( $_POST['kt-addtocart-field1'] ) && ! empty( $_POST['kt-addtocart-field1'] )){
        $cart_item_data['custom_data']['upfx_addtocart_field1']  = $_POST['kt-addtocart-field1'];
        // $cart_item_data['custom_data']['unique_key'] = md5( microtime().rand() );
    }
    return $cart_item_data;
}

// add field1 to order item meta
function upfx_add_orderitem_meta_field1( $item_id, $values, $cart_item_key ) {
  $cart_item_data = WC()->cart->get_cart_item($cart_item_key);
  wc_add_order_item_meta( $item_id, "field1", $cart_item_data['custom_data']['upfx_addtocart_field1'] );
}
add_action( 'woocommerce_add_order_item_meta', 'upfx_add_orderitem_meta_field1', 1, 3 );

原始答案(已过时)- 某些部件到 2023 年将不再工作:

您可以通过使用以下 woocommerce 挂钩来实现此目的woocommerce_before_add_to_cart_button, woocommerce_add_to_cart, woocommerce_cart_item_name,and '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/ http://sarkware.com/how-to-pass-custom-data-to-cart-line-item-in-woocommerce-without-using-plugins/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WooCommerce:向购物车中的每个项目添加输入字段 的相关文章

随机推荐

  • FastAPI 中的返回值[重复]

    这个问题在这里已经有答案了 我试图在 FastAPI 中返回 matplotlib figure Figure 如果我像图像一样保存它 它就可以工作 代码在这里 router get graph id file name Return th
  • SQL SMO 执行批处理 TSQL 脚本

    我正在使用 SMO 执行批处理 SQL 脚本 在 Management Studio 中 该脚本的执行时间约为 2 秒 使用以下代码 大约需要 15 秒 var connectionString GetConnectionString ne
  • 非标准网址格式

    我们在应用程序中向客户发送了邮件 其中有一个链接 在 yahoo 和 Hotmail 中 每当客户单击链接时 它都会显示以下警告 替代文本 http img691 imageshack us img691 5402 warningp jpg
  • Twitter Bootstrap 下拉链接不起作用

    我正在使用引导程序版本2 0 我有以下 html 结构 现在当我点击Filter by Team下拉菜单正确显示 现在 当我点击链接时 我应该被带到该页面 但链接确实not工作 我的意思是 当我单击下拉元素时 它们应该将我带到一个 URL
  • 使用 JS 检查 HTML5

    我有一个页面包含一些 JS 来更新浏览器历史记录 pushState 使用 HTML5 由于 IE8 不支持 HTML5 用户会被告知该页面包含错误 虽然这并没有削弱页面的功能 但它看起来不太专业 所以我想知道在运行此代码之前是否检查用户浏
  • Chrome 在下载的文件中添加“-, 附件”

    我使用 Symfony2 框架并使用以下代码导出 xml 文件 response gt setStatusCode 200 response gt headers gt set Content Type application xml re
  • MSIL 源代码的编译器位于 .NET Framework 中的什么位置?

    我有一个关于 NET Framework 的问题 MSIL 源代码的编译器驻留在哪里 是在 CLR 本身还是任何其他层 另外 请给我提供有关 NET Framework 的非常小 但足够 的插图 这是一个快速流程图 未遵循的符号 可以澄清大
  • 获取退出代码 - Go

    我正在使用的包 os exechttp golang org pkg os exec http golang org pkg os exec 在操作系统中执行命令 但我似乎找不到获取退出代码的方法 我可以读取输出 ie package ma
  • 如何在类之间传递对象

    所以我在这里想做的是传递一个类的相同副本 class A 到另一个班级 class B but class B实例化于class A Using a new中的声明class B不起作用 因为当我希望能够使用第一个实例中的变量时 它会导致无
  • 如何在 ubuntu 中使用 python 将原始字符串发送到点阵打印机?

    我有一台点阵打印机 LX 300 通过网络连接到我的计算机 如何在 Python 中将带有 ESCP 字符的原始字符串直接发送到打印机 该计算机通过另一台计算机连接到打印机 我需要发送原始字符串 因为 LX 300 图像打印结果模糊 问题
  • 如何在 Spring.Net 中配置 NULL 对象

    在我正在工作的特定项目中 有一个空日志服务对象是合适的 由于这是在 Spring Net 中配置的 因此如何将 spring net 对象配置为 null 这就是我想做的 是否可以
  • 如何使用 axios 下载包含多种类型文件的 zip

    在我的 vueJs 应用程序中 我有以下 axios POST api 调用 该调用应该返回我希望保存在 zip 文件夹中的多个文件 但是 当我使用以下 axios 方法时 我无法打开我的 zip 并且出现错误 提示 myfolder zi
  • 重写整个 git 历史记录

    很久以前 我在 github 上分叉了一个 repo 并对几个不相关的功能做了相当多的更改 当时我对 git 基本上一无所知 所以我的提交基本上只是 自上次以来我碰巧做过的事情 我记得提交的时间是 我想向上游贡献一些更改 但在我的存储库当前
  • Javascript 相当于 Rails try 方法

    在 Rails 中我可以这样做 x user try name 这个方法返回nil if user is nil else user name Here name是一个定义在user object 我知道可以使用if then else在
  • 强制 selenium 暂停并等待字段可用

    下面是我的 python 脚本中的一段代码 它读取一个 Excel 文件并将行中的单元格分配给一个变量 然后将该变量输入到浏览器中的字段中 它工作得很好 在大多数情况下 我想做的是在浏览器加载页面后设置某种循环以执行以下操作 通过某个 ID
  • 使用 Node.js 处理 SAML 的身份提供商端

    我需要实现一个应该能够实现的身份提供者服务 使用node js 获取 验证和解析 使用私钥和证书 来自 SP 的身份验证请求example https www samltool com generic sso req php 如果一切有效
  • 隐藏 C 结构体中的成员

    我一直在阅读有关 C 语言中的 OOP 的内容 但我从来不喜欢你不能像 C 中那样拥有私有数据成员 但后来我想到你可以创建 2 个结构 一种是在头文件中定义 另一种是在源文件中定义 in somestruct h typedef struc
  • PHP 语法高亮[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个PHP 语法高亮引擎可以定制 即我可以提供我的自己的分词器对于新语言 并且可以处理多种语
  • Python - 读取电子表格

    我需要知道的是 我可以让Python读取电子表格 最好是Microsoft Excel 然后解析信息并将其输入到方程中吗 它适用于赛马程序 其中多匹马的信息将位于一个 Excel 电子表格中的不同行或列中 我需要知道是否可以分别对每匹马进行
  • WooCommerce:向购物车中的每个项目添加输入字段

    我一直在尝试向购物车中的每个项目添加一个文本输入字段 并将用户输入提交到产品的元信息 已经2天了 我还没有成功 我的目标是 获取用户对添加到购物车中的每件商品的输入 在订单的元信息中显示该输入 在发送给客户的确认电子邮件中显示该输入 到目前