将产品附加字段添加到 WooCommerce 上的特定产品
Add a product add-on field to specific products on WooCommerce
我需要更改代码以不在我的所有 WooCommerce 产品上显示文本区域,但只有 2 个,这是在 functions.php
文件下的我的 WordPress 子主题上。
我已将 $product_id 更改为 $product_id = 2130
(我的特定产品 ID),
不确定我是否应该更改所有 $product_id
或 $_POST
以使此代码仅显示在 2 个产品上
它适用于使用名称个性化的特定产品。我曾尝试将代码 $product_id 更改为许多其他扩展,但无济于事。我不确定我是否应该用什么代码替换所有 $product_id ,或者它应该在 $_POST
并替换所有代码。
add_action( 'woocommerce_before_add_to_cart_button', 'custom_product_add_on', 9 );
function custom_product_add_on() {
$value = isset( $_POST['_custom_text_add_on'] ) ? sanitize_text_field( $_POST['_custom_text_add_on'] ) : '';
echo '<div>
<label>Custom Text Add-On <abbr class="required" title="required">*</abbr></label>
<p>
<input name="_custom_text_add_on" value="' . $value . '">
</p>
</div>';
}
add_filter( 'woocommerce_add_to_cart_validation', 'custom_product_add_on_validation', 10, 3 );
function custom_product_add_on_validation( $passed, $product_id, $qty ){
if( isset( $_POST['_custom_text_add_on'] ) && sanitize_text_field(
$_POST['_custom_text_add_on'] ) == '' ) {
wc_add_notice( 'Custom Text Add-On is a required field', 'error' );
$passed = false;
}
return $passed;
}
add_filter( 'woocommerce_add_cart_item_data', 'custom_product_add_on_cart_item_data', 10, 2 );
function custom_product_add_on_cart_item_data( $cart_item, $product_id ){
if( isset( $_POST['_custom_text_add_on'] ) ) {
$cart_item['custom_text_add_on'] = sanitize_text_field(
$_POST['_custom_text_add_on'] );
}
return $cart_item;
}
add_filter( 'woocommerce_get_item_data', 'custom_product_add_on_display_cart', 10, 2 );
function custom_product_add_on_display_cart( $_data, $cart_item ) {
if ( isset( $cart_item['custom_text_add_on'] ) ){
$data[] = array(
'name' => 'Custom Text Add-On',
'value' => sanitize_text_field( $cart_item['custom_text_add_on'] )
);
}
return $data;
}
add_action( 'woocommerce_add_order_item_meta', 'custom_product_add_on_order_item_meta', 10, 2 );
function custom_product_add_on_order_item_meta( $item_id, $values ) {
if ( ! empty( $values['custom_text_add_on'] ) ) {
wc_add_order_item_meta( $item_id, 'Custom Text Add-On',
$values['custom_text_add_on'], true );
}
}
add_filter( 'woocommerce_order_item_product', 'custom_product_add_on_display_order', 10, 2 );
function custom_product_add_on_display_order( $cart_item, $order_item ){
if( isset( $order_item['custom_text_add_on'] ) ){
$cart_item_meta['custom_text_add_on'] =
$order_item['custom_text_add_on'];
}
return $cart_item;
}
add_filter( 'woocommerce_email_order_meta_fields', 'custom_product_add_on_display_emails' );
function custom_product_add_on_display_emails( $fields ) {
$fields['custom_text_add_on'] = 'Custom Text Add-On';
return $fields;
}
我几乎到处都重新访问了您的代码,进行了一些更改并删除了不必要的功能。
您必须在 $defined_products_ids
变量数组中的前 2 个函数中定义您想要的产品 ID。
我在下拉列表之间添加了一个 12px 的 space / add-on 并在可变产品中添加到购物车按钮。
完整代码:
// Display Product add on custom fields
add_action( 'woocommerce_before_add_to_cart_button', 'display_product_add_on_custom_fields', 9 );
function display_product_add_on_custom_fields() {
global $product;
$defined_products_ids = array( 37, 53 );
if( in_array($product->get_id(), $defined_products_ids) ) {
$value = isset($_POST['custom_text']) ? $_POST['custom_text'] : '';
// Adding some space between dropdowns and add to cart button for variable products
$style = $product->is_type('variable') ? ' style="padding-bottom:12px;"' : '';
echo '<div class="product-add-on"' . $style . '>
<label>'. __('Add your customized text', 'woocommerce') . ' ' .
'<abbr class="required" title="required">*</abbr>
</label>
<p>
<input name="custom_text" value="' . $value . '">
</p>
</div>';
}
}
// Product add on custom fields validation
add_filter( 'woocommerce_add_to_cart_validation', 'product_add_on_custom_fields_validation', 10, 3 );
function product_add_on_custom_fields_validation( $passed, $product_id, $quantity ){
$defined_products_ids = array( 37, 53 );
if( isset( $_POST['custom_text'] ) && empty( $_POST['custom_text'] )
&& in_array($product_id, $defined_products_ids) ) {
wc_add_notice( '"Custom Text" is a required field', 'error' );
$passed = false;
}
return $passed;
}
// Add custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 10, 2 );
function add_custom_cart_item_data( $cart_item_data, $product_id ){
if( isset($_POST['custom_text']) ) {
$cart_item_data['custom_text'] = sanitize_text_field( $_POST['custom_text'] );
$cart_item_data['unique_key'] = md5( microtime().rand() ); // Make each item unique
}
return $cart_item_data;
}
// Display custom cart item data on cart and checkout
add_filter( 'woocommerce_get_item_data', 'display_custom_cart_item_data', 10, 2 );
function display_custom_cart_item_data( $cart_item_data, $cart_item ) {
if ( isset( $cart_item['custom_text'] ) ){
$cart_item_data[] = array(
'name' => __('Your custom text', 'woocommerce'),
'value' => $cart_item['custom_text'] // Already sanitized field
);
}
return $cart_item_data;
}
// Save and display custom item data everywhere on orders and email notifications
add_action( 'woocommerce_checkout_create_order_line_item', 'add_product_custom_field_as_order_item_meta', 10, 4 );
function add_product_custom_field_as_order_item_meta( $item, $cart_item_key, $values, $order ) {
if ( isset($values['custom_text']) ) {
$item->update_meta_data('Your custom text', $values['custom_text'] );
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。测试和工作。
我需要更改代码以不在我的所有 WooCommerce 产品上显示文本区域,但只有 2 个,这是在 functions.php
文件下的我的 WordPress 子主题上。
我已将 $product_id 更改为 $product_id = 2130
(我的特定产品 ID),
不确定我是否应该更改所有 $product_id
或 $_POST
以使此代码仅显示在 2 个产品上
它适用于使用名称个性化的特定产品。我曾尝试将代码 $product_id 更改为许多其他扩展,但无济于事。我不确定我是否应该用什么代码替换所有 $product_id ,或者它应该在 $_POST
并替换所有代码。
add_action( 'woocommerce_before_add_to_cart_button', 'custom_product_add_on', 9 );
function custom_product_add_on() {
$value = isset( $_POST['_custom_text_add_on'] ) ? sanitize_text_field( $_POST['_custom_text_add_on'] ) : '';
echo '<div>
<label>Custom Text Add-On <abbr class="required" title="required">*</abbr></label>
<p>
<input name="_custom_text_add_on" value="' . $value . '">
</p>
</div>';
}
add_filter( 'woocommerce_add_to_cart_validation', 'custom_product_add_on_validation', 10, 3 );
function custom_product_add_on_validation( $passed, $product_id, $qty ){
if( isset( $_POST['_custom_text_add_on'] ) && sanitize_text_field(
$_POST['_custom_text_add_on'] ) == '' ) {
wc_add_notice( 'Custom Text Add-On is a required field', 'error' );
$passed = false;
}
return $passed;
}
add_filter( 'woocommerce_add_cart_item_data', 'custom_product_add_on_cart_item_data', 10, 2 );
function custom_product_add_on_cart_item_data( $cart_item, $product_id ){
if( isset( $_POST['_custom_text_add_on'] ) ) {
$cart_item['custom_text_add_on'] = sanitize_text_field(
$_POST['_custom_text_add_on'] );
}
return $cart_item;
}
add_filter( 'woocommerce_get_item_data', 'custom_product_add_on_display_cart', 10, 2 );
function custom_product_add_on_display_cart( $_data, $cart_item ) {
if ( isset( $cart_item['custom_text_add_on'] ) ){
$data[] = array(
'name' => 'Custom Text Add-On',
'value' => sanitize_text_field( $cart_item['custom_text_add_on'] )
);
}
return $data;
}
add_action( 'woocommerce_add_order_item_meta', 'custom_product_add_on_order_item_meta', 10, 2 );
function custom_product_add_on_order_item_meta( $item_id, $values ) {
if ( ! empty( $values['custom_text_add_on'] ) ) {
wc_add_order_item_meta( $item_id, 'Custom Text Add-On',
$values['custom_text_add_on'], true );
}
}
add_filter( 'woocommerce_order_item_product', 'custom_product_add_on_display_order', 10, 2 );
function custom_product_add_on_display_order( $cart_item, $order_item ){
if( isset( $order_item['custom_text_add_on'] ) ){
$cart_item_meta['custom_text_add_on'] =
$order_item['custom_text_add_on'];
}
return $cart_item;
}
add_filter( 'woocommerce_email_order_meta_fields', 'custom_product_add_on_display_emails' );
function custom_product_add_on_display_emails( $fields ) {
$fields['custom_text_add_on'] = 'Custom Text Add-On';
return $fields;
}
我几乎到处都重新访问了您的代码,进行了一些更改并删除了不必要的功能。
您必须在 $defined_products_ids
变量数组中的前 2 个函数中定义您想要的产品 ID。
我在下拉列表之间添加了一个 12px 的 space / add-on 并在可变产品中添加到购物车按钮。
完整代码:
// Display Product add on custom fields
add_action( 'woocommerce_before_add_to_cart_button', 'display_product_add_on_custom_fields', 9 );
function display_product_add_on_custom_fields() {
global $product;
$defined_products_ids = array( 37, 53 );
if( in_array($product->get_id(), $defined_products_ids) ) {
$value = isset($_POST['custom_text']) ? $_POST['custom_text'] : '';
// Adding some space between dropdowns and add to cart button for variable products
$style = $product->is_type('variable') ? ' style="padding-bottom:12px;"' : '';
echo '<div class="product-add-on"' . $style . '>
<label>'. __('Add your customized text', 'woocommerce') . ' ' .
'<abbr class="required" title="required">*</abbr>
</label>
<p>
<input name="custom_text" value="' . $value . '">
</p>
</div>';
}
}
// Product add on custom fields validation
add_filter( 'woocommerce_add_to_cart_validation', 'product_add_on_custom_fields_validation', 10, 3 );
function product_add_on_custom_fields_validation( $passed, $product_id, $quantity ){
$defined_products_ids = array( 37, 53 );
if( isset( $_POST['custom_text'] ) && empty( $_POST['custom_text'] )
&& in_array($product_id, $defined_products_ids) ) {
wc_add_notice( '"Custom Text" is a required field', 'error' );
$passed = false;
}
return $passed;
}
// Add custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 10, 2 );
function add_custom_cart_item_data( $cart_item_data, $product_id ){
if( isset($_POST['custom_text']) ) {
$cart_item_data['custom_text'] = sanitize_text_field( $_POST['custom_text'] );
$cart_item_data['unique_key'] = md5( microtime().rand() ); // Make each item unique
}
return $cart_item_data;
}
// Display custom cart item data on cart and checkout
add_filter( 'woocommerce_get_item_data', 'display_custom_cart_item_data', 10, 2 );
function display_custom_cart_item_data( $cart_item_data, $cart_item ) {
if ( isset( $cart_item['custom_text'] ) ){
$cart_item_data[] = array(
'name' => __('Your custom text', 'woocommerce'),
'value' => $cart_item['custom_text'] // Already sanitized field
);
}
return $cart_item_data;
}
// Save and display custom item data everywhere on orders and email notifications
add_action( 'woocommerce_checkout_create_order_line_item', 'add_product_custom_field_as_order_item_meta', 10, 4 );
function add_product_custom_field_as_order_item_meta( $item, $cart_item_key, $values, $order ) {
if ( isset($values['custom_text']) ) {
$item->update_meta_data('Your custom text', $values['custom_text'] );
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。测试和工作。