使 Woocommerce (3.8.0) 管理员电子邮件包含结帐页面中的我的自定义字段数据
Make Woocommerce (3.8.0) admin email include my custom field data from the checkout page
我在 woocommerce 结账页面上创建了一些自定义字段。我的代码是正确的,字段显示正确
我已经保存了现场数据并将它们显示在管理面板中。我的代码是正确的,字段显示正确。
我编写了代码,以便在订购新产品时将此数据包含在管理员电子邮件中。
我的代码不正确,电子邮件中没有显示信息。
有关此主题的所有其他 Whosebug 答案都依赖于已弃用的过滤器
woocommerce_email_order_meta_keys
没有用 woocommerce 3.8.0 回答的 Whosebug woocommerce_email_order_meta_fields
过滤器。
我是 运行 woocommerce 3.8.0 和 wordpress 5.3。
我将这些文件保存在 wp-content/themes/child-theme/functions.php
卧槽我的代码有问题?我检查了一遍又一遍,我无法弄清楚哪里出了问题。有人可以告诉我我做错了什么吗?我是 rails 的 ruby 开发人员,试图自学 php 和 wordpress。
add_filter('woocommerce_email_order_meta_fields','custom_woocommerce_email_order_meta_fields', 10, 3 );
function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
$fields['custom_field_1'] = array(
'label' => __( 'custom_field_1' ),
'value' => get_post_meta( $order->id, 'custom_field_1', true ),
);
$fields['custom_field_2'] = array(
'label' => __( 'custom_field_2' ),
'value' => get_post_meta( $order->id, 'custom_field_2', true ),
);
$fields['custom_field_3'] = array(
'label' => __( 'custom_field_3' ),
'value' => get_post_meta( $order->id, 'custom_field_3', true ),
);
$fields['custom_field_4'] = array(
'label' => __( 'custom_field_4' ),
'value' => get_post_meta( $order->id, 'custom_field_4', true ),
);
return $fields;
}
我在 woocommerce 结帐页面中的自定义表单字段在这里
add_filter( 'woocommerce_checkout_fields', 'isca_custom_checkout_fields' );`
function isca_custom_checkout_fields($fields){
$fields['isca_extra_fields'] = array(
'custom_field_1' => array(
'class' => array(
'form-row-first'
),
'type' => 'text',
'required' => true,
'placeholder' => __( 'Name' )
),
'custom_field_2' => array(
'class' => array(
'form-row-last'
),
'type' => 'text',
'required' => true,
'placeholder' => __( 'Nickname' )
),
'custom_field_3' => array(
'class' => array(
'form-row-first'
),
'type' => 'text',
'required' => true,
'placeholder' => __( 'Favorite Exercise' )
),
'custom_field_4' => array(
'class' => array(
'form-row-last'
),
'type' => 'text',
'required' => false,
'placeholder' => __( 'Favorite Stretch' )
),
);
return $fields;
}
然后我使用此代码将其添加到 woocomerce 结帐页面
add_action( 'woocommerce_after_checkout_billing_form' ,'isca_extra_checkout_fields' );
function isca_extra_checkout_fields(){
$checkout = WC()->checkout(); ?>
<br/>
<div class="extra-fields">
<h3><?php _e( 'Fitness Information' ); ?></h3>
<?php
foreach ( $checkout->checkout_fields['isca_extra_fields'] as $key => $field ) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>
</div>
<?php }
WordPress 有一个选项可以打开调试模式,以便识别和解决错误和警告。当您的代码出现任何错误时,错误将记录在 WordPress 文件夹 wp-content
文件夹中名为 debug.log
的文件中。因此,在使用 WordPress 进行开发时,您必须打开三个选项。
转到 wp-config.php 并添加这三行代码
define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
您的 custom_woocommerce_email_order_meta_field
s 函数有错误。您错误地调用了订单 ID。错误日志将显示。不应直接调用订单属性。因此,您必须将 $order->id
更改为 $order->get_id()
。所以把函数改成
function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
if( !$sent_to_admin ){
return;
}
$fields['custom_field_1'] = array(
'label' => __( 'custom field 1' ),
'value' => get_post_meta( $order->get_id(), 'custom_field_1', true ),
);
$fields['custom_field_2'] = array(
'label' => __( 'custom field 2' ),
'value' => get_post_meta( $order->get_id(), 'custom_field_2', true ),
);
$fields['custom_field_3'] = array(
'label' => __( 'custom field 3' ),
'value' => get_post_meta( $order->get_id(), 'custom_field_3', true ),
);
$fields['custom_field_4'] = array(
'label' => __( 'custom field 4' ),
'value' => get_post_meta( $order->get_id(), 'custom_field_4', true ),
);
return $fields;
}
此外,您还没有编写任何代码来保存添加到结帐页面的自定义字段。您正在尝试查找未保存在订单元中的值。您需要编写代码以将自定义添加的结帐字段保存到订单元数据中,如下所示。
add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');
function my_custom_checkout_field_update_order_meta( $order_id ) {
if ($_POST['custom_field_1']) update_post_meta( $order_id, 'custom_field_1', esc_attr($_POST['custom_field_1']));
if ($_POST['custom_field_2']) update_post_meta( $order_id, 'custom_field_2', esc_attr($_POST['custom_field_2']));
if ($_POST['custom_field_3']) update_post_meta( $order_id, 'custom_field_3', esc_attr($_POST['custom_field_3']));
if ($_POST['custom_field_4']) update_post_meta( $order_id, 'custom_field_4', esc_attr($_POST['custom_field_4']));
}
完成。 . .现在一切都完美地添加到电子邮件中(经过测试和确认)。此外,由于您说过这些字段显示在管理员电子邮件中,因此您必须使用
检查该条件
if( !$sent_to_admin ){
return;
}
这是我在 custom_woocommerce_email_order_meta_fields
函数中添加的。
我在 woocommerce 结账页面上创建了一些自定义字段。我的代码是正确的,字段显示正确 我已经保存了现场数据并将它们显示在管理面板中。我的代码是正确的,字段显示正确。
我编写了代码,以便在订购新产品时将此数据包含在管理员电子邮件中。 我的代码不正确,电子邮件中没有显示信息。
有关此主题的所有其他 Whosebug 答案都依赖于已弃用的过滤器
woocommerce_email_order_meta_keys
没有用 woocommerce 3.8.0 回答的 Whosebug woocommerce_email_order_meta_fields
过滤器。
我是 运行 woocommerce 3.8.0 和 wordpress 5.3。 我将这些文件保存在 wp-content/themes/child-theme/functions.php
卧槽我的代码有问题?我检查了一遍又一遍,我无法弄清楚哪里出了问题。有人可以告诉我我做错了什么吗?我是 rails 的 ruby 开发人员,试图自学 php 和 wordpress。
add_filter('woocommerce_email_order_meta_fields','custom_woocommerce_email_order_meta_fields', 10, 3 );
function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
$fields['custom_field_1'] = array(
'label' => __( 'custom_field_1' ),
'value' => get_post_meta( $order->id, 'custom_field_1', true ),
);
$fields['custom_field_2'] = array(
'label' => __( 'custom_field_2' ),
'value' => get_post_meta( $order->id, 'custom_field_2', true ),
);
$fields['custom_field_3'] = array(
'label' => __( 'custom_field_3' ),
'value' => get_post_meta( $order->id, 'custom_field_3', true ),
);
$fields['custom_field_4'] = array(
'label' => __( 'custom_field_4' ),
'value' => get_post_meta( $order->id, 'custom_field_4', true ),
);
return $fields;
}
我在 woocommerce 结帐页面中的自定义表单字段在这里
add_filter( 'woocommerce_checkout_fields', 'isca_custom_checkout_fields' );`
function isca_custom_checkout_fields($fields){
$fields['isca_extra_fields'] = array(
'custom_field_1' => array(
'class' => array(
'form-row-first'
),
'type' => 'text',
'required' => true,
'placeholder' => __( 'Name' )
),
'custom_field_2' => array(
'class' => array(
'form-row-last'
),
'type' => 'text',
'required' => true,
'placeholder' => __( 'Nickname' )
),
'custom_field_3' => array(
'class' => array(
'form-row-first'
),
'type' => 'text',
'required' => true,
'placeholder' => __( 'Favorite Exercise' )
),
'custom_field_4' => array(
'class' => array(
'form-row-last'
),
'type' => 'text',
'required' => false,
'placeholder' => __( 'Favorite Stretch' )
),
);
return $fields;
}
然后我使用此代码将其添加到 woocomerce 结帐页面
add_action( 'woocommerce_after_checkout_billing_form' ,'isca_extra_checkout_fields' );
function isca_extra_checkout_fields(){
$checkout = WC()->checkout(); ?>
<br/>
<div class="extra-fields">
<h3><?php _e( 'Fitness Information' ); ?></h3>
<?php
foreach ( $checkout->checkout_fields['isca_extra_fields'] as $key => $field ) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>
</div>
<?php }
WordPress 有一个选项可以打开调试模式,以便识别和解决错误和警告。当您的代码出现任何错误时,错误将记录在 WordPress 文件夹 wp-content
文件夹中名为 debug.log
的文件中。因此,在使用 WordPress 进行开发时,您必须打开三个选项。
转到 wp-config.php 并添加这三行代码
define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
您的 custom_woocommerce_email_order_meta_field
s 函数有错误。您错误地调用了订单 ID。错误日志将显示。不应直接调用订单属性。因此,您必须将 $order->id
更改为 $order->get_id()
。所以把函数改成
function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
if( !$sent_to_admin ){
return;
}
$fields['custom_field_1'] = array(
'label' => __( 'custom field 1' ),
'value' => get_post_meta( $order->get_id(), 'custom_field_1', true ),
);
$fields['custom_field_2'] = array(
'label' => __( 'custom field 2' ),
'value' => get_post_meta( $order->get_id(), 'custom_field_2', true ),
);
$fields['custom_field_3'] = array(
'label' => __( 'custom field 3' ),
'value' => get_post_meta( $order->get_id(), 'custom_field_3', true ),
);
$fields['custom_field_4'] = array(
'label' => __( 'custom field 4' ),
'value' => get_post_meta( $order->get_id(), 'custom_field_4', true ),
);
return $fields;
}
此外,您还没有编写任何代码来保存添加到结帐页面的自定义字段。您正在尝试查找未保存在订单元中的值。您需要编写代码以将自定义添加的结帐字段保存到订单元数据中,如下所示。
add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');
function my_custom_checkout_field_update_order_meta( $order_id ) {
if ($_POST['custom_field_1']) update_post_meta( $order_id, 'custom_field_1', esc_attr($_POST['custom_field_1']));
if ($_POST['custom_field_2']) update_post_meta( $order_id, 'custom_field_2', esc_attr($_POST['custom_field_2']));
if ($_POST['custom_field_3']) update_post_meta( $order_id, 'custom_field_3', esc_attr($_POST['custom_field_3']));
if ($_POST['custom_field_4']) update_post_meta( $order_id, 'custom_field_4', esc_attr($_POST['custom_field_4']));
}
完成。 . .现在一切都完美地添加到电子邮件中(经过测试和确认)。此外,由于您说过这些字段显示在管理员电子邮件中,因此您必须使用
检查该条件if( !$sent_to_admin ){
return;
}
这是我在 custom_woocommerce_email_order_meta_fields
函数中添加的。