我找到了一个有效的解决方案,使用 jQuery 将表单字段值添加到 AJAX 请求。这需要使用您自己的版本覆盖 add-to-cart.js,因此可能需要合并该文件的未来更新。
在functions.php中
// display add-on fields in woocommerce_after_shop_loop_item_title
add_action( 'woocommerce_after_shop_loop_item_title', array($GLOBALS['Product_Addon_Display'], 'display'), 10);
// Our custom cart JS to allow for product add-on fields on product archive
add_action( 'wp_enqueue_scripts', 'load_woo_scripts', 9 );
function load_woo_scripts() {
wp_enqueue_script( 'wc-add-to-cart', get_template_directory_uri() . '/js/add-to-cart.js', array( 'jquery' ), WC_VERSION, true );
}
复制/assets/add-to-cart.js
从 woocommerce 插件文件夹中,并将其添加到中引用的文件夹中load_woo_scripts
。然后在后面添加以下内容var date = {
声明(第 21 行)。
// =========================================================================
// ADD PRODUCT ADD-ON FIELDS TO SUBMISSION (to allow from product archive)
// Store name and value of fields in object.
var addonfields = {};
$(this).parent().find(".after-shop-loop-item-title :input").each(function() {
addonfields[this.name] = $(this).val();
});
// Merge new fields and existing data
data = $.extend(data, addonfields);
// Testing: final value of data
console.log( data );
// =========================================================================
这会添加所有输入字段的名称和值.after-shop-loop-item-title
分区我已将此 div/类添加到我的主题中woocommerce/content-product.php
模板:
<?php do_action( 'woocommerce_before_shop_loop_item' ); ?>
<h2><?php the_title(); ?></h2>
<div itemprop="description">
<?php the_content(); ?>
</div>
<div class="after-shop-loop-item-title">
<?php
/**
* woocommerce_after_shop_loop_item_title hook
*
* @hooked woocommerce_template_loop_rating - 5
* @hooked woocommerce_template_loop_price - 10
*/
do_action( 'woocommerce_after_shop_loop_item_title' );
?>
</div>
<?php do_action( 'woocommerce_after_shop_loop_item' ); ?>
请注意,就我而言,我仅使用文本区域和文本输入。两者都不会改变价格。扩展的更高级使用可能需要更多工作。
我真的希望 WooCommerce 将来能让这一切变得更容易......