如何解决在WooCommerce电子邮件订购项目中显示可变产品的产品自定义字段
我已在产品中添加了自定义SKU,供供应商SKU用于订单确认电子邮件。我创建的内容仅适用于简单产品,不适用于可变产品。
自定义SKU,
我将此添加到functions.php
function jk_add_custom_sku() {
$args = array(
'label' => __( 'Custom SKU','woocommerce' ),'placeholder' => __( 'Enter custom SKU here','id' => 'jk_sku','desc_tip' => true,'description' => __( 'This SKU is for internal use only.',);
woocommerce_wp_text_input( $args );
}
add_action( 'woocommerce_product_options_sku','jk_add_custom_sku' );
function jk_save_custom_sku( $post_id ) {
// grab the custom SKU from $_POST
$custom_sku = isset( $_POST[ 'jk_sku' ] ) ? sanitize_text_field( $_POST[ 'jk_sku' ] ) : '';
// grab the product
$product = wc_get_product( $post_id );
// save the custom SKU using WooCommerce built-in functions
$product->update_meta_data( 'jk_sku',$custom_sku );
$product->save();
}
add_action( 'woocommerce_process_product_meta','jk_save_custom_sku' );
接下来,我修改了电子邮件模板email-order-items.php并将其添加到SKU部分,以检查是否存在自定义SKU。
<?php
// Show title/image etc.
if ( $show_image ) {
echo wp_kses_post( apply_filters( 'woocommerce_order_item_thumbnail',$image,$item ) );
}
// Product name.
echo wp_kses_post( apply_filters( 'woocommerce_order_item_name',$item->get_name(),$item,false ) );
// SKU.
if ( $show_sku && $sku ) {
echo wp_kses_post( ' (#' . $sku . ')' );
// load the custom SKU
$custom_sku = get_post_meta( $product->get_id(),'jk_sku',true );
if ( is_string( $custom_sku ) ) { // only show the custom SKU if it's set
echo "<br>" . wp_kses_post( "Custom SKU: $custom_sku" ); // change this line if needed
}
}
// allow other plugins to add additional product information here.
do_action( 'woocommerce_order_item_meta_start',$item_id,$order,$plain_text );
wc_display_item_meta(
$item,array(
'label_before' => '<strong class="wc-item-meta-label" style="float: ' . esc_attr( $text_align ) . '; margin-' . esc_attr( $margin_side ) . ': .25em; clear: both">',)
);
// allow other plugins to add additional product information here.
do_action( 'woocommerce_order_item_meta_end',$plain_text );
?>
</td>
自定义SKU仅显示在简单产品的电子邮件中。我需要它来配合Variable产品使用。每个产品只有一个自定义SKU,而每个可变产品只有一个。
解决方法
我再次回顾了您的代码,并将元键更改为_sku2
,就像WooCommerce元键以下划线开头一样:
add_action( 'woocommerce_product_options_sku','add_product_sku2_custom_field' );
function add_product_sku2_custom_field() {
$field_key = '_sku2';
woocommerce_wp_text_input( array(
'id' => $field_key,'label' => __( 'Custom SKU','woocommerce' ),'placeholder' => __( 'Enter custom SKU here','desc_tip' => true,'description' => __( 'This SKU is for internal use only.',) );
}
add_action( 'woocommerce_admin_process_product_object','save_product_sku2_custom_field_value' );
function save_product_sku2_custom_field_value( $product ) {
$field_key = '_sku2';
if ( isset($_POST[$field_key]) ) {
$product->update_meta_data( $field_key,sanitize_text_field($_POST[$field_key]) );
}
}
对于产品变体,您需要获取父变量产品,以显示(请参见最后的代码)
现在也要为可变产品的产品变体启用附加的自定义SKU,请使用以下命令:
add_action( 'woocommerce_variation_options_pricing','add_product_variation_sku2_custom_field',10,3 );
function add_product_variation_sku2_custom_field( $loop,$variation_data,$variation ){
$field_key = '_sku2';
woocommerce_wp_text_input( array(
'id' => $field_key.'['.$loop.']','value' => get_post_meta( $variation->ID,$field_key,true )
) );
}
add_action( 'woocommerce_save_product_variation','save_product_variation_sku2_custom_field_value',2 );
function save_product_variation_sku2_custom_field_value( $variation_id,$i ){
$field_key = '_sku2';
if( isset($_POST[$field_key][$i]) ){
update_post_meta( $variation_id,sanitize_text_field($_POST[$field_key][$i]) );
}
}
代码进入活动子主题(或活动主题)的functions.php文件中。经过测试,可以正常工作。
在您的模板自定义代码中,您将替换:
// SKU.
if ( $show_sku && $sku ) {
echo wp_kses_post( ' (#' . $sku . ')' );
// load the custom SKU
$custom_sku = get_post_meta( $product->get_id(),'jk_sku',true );
if ( is_string( $custom_sku ) ) { // only show the custom SKU if it's set
echo "<br>" . wp_kses_post( "Custom SKU: $custom_sku" ); // change this line if needed
}
}
通过以下(适用于可变产品或产品变体)
:// SKU (and SKU2)
if ( $show_sku && $sku ) {
echo wp_kses_post( ' (#' . $sku . ')' );
// load the custom SKU
$sku2 = $product->get_meta('_sku2');
// For product variations with empty SKU (get the parent variable product SKU)
if ( empty($sku2) && $product->is_type('variation') ) {
// Get parent variable product Id
$parent_product_id = $product->get_parent_id();
$parent_product = wc_get_product($parent_product_id);
$sku2 = $parent_product->get_meta('_sku2');
}
// only show the custom SKU if it's set (and product variation too)
if ( ! empty($sku2) ) {
echo "<br>" . wp_kses_post( sprintf( __("Custom SKU: %s","woocommerce"),$sku2 ) ); // change this line if needed
}
}
对于产品变体,如果没有任何“ custom sku”,它将尝试获取父变量产品“ custom sku”。
应该可以。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。