在电子邮件通知上显示 WooCommerce 自定义结帐字段值
Display a WooCommerce custom checkout field value on email notification
我在将自定义字段变量传递到电子邮件收据时遇到了一些问题。我浏览了 Whosebug,但不幸的是,answers/solutions 的 none 对我的情况有所帮助。
我创建的字段确实正确显示在管理仪表板和结帐后页面中,只是不会在任何电子邮件中显示变量。
这里是我在 functions.php 中创建自定义字段的地方:
function my_custom_checkout_field( $checkout ) {
echo '<div id="my_custom_checkout_field"><h2>' . __('Bezorg moment') . '</h2>';
woocommerce_form_field( 'delivery_date', array(
'type' => 'select',
'options' => array(
'17:30-18:00' => __('17:30 - 18:00', 'woocommerce' ),
'18:00-18:30' => __('18:00 - 18:30', 'woocommerce' )),
'class' => array('my-field-class form-row-wide'),
'label' => __('Bezorgtijd'),
'placeholder' => __('Zo snel mogelijk'),
), $checkout->get_value( 'delivery_date' ));
echo '</div>'; }
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );
这是我更新 post 元数据的地方:
function my_custom_checkout_field_update_order_meta( $order_id ) {
if ( ! empty( $_POST['delivery_date'] ) ) {
update_post_meta( $order_id, 'Bezorg moment', sanitize_text_field( $_POST['delivery_date'] ) );
} }
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );
这是我将值传递给管理订单仪表板的地方:
function my_custom_checkout_field_display_admin_order_meta($order){
echo '<p><strong>'.__('Bezorg moment').':</strong> ' . get_post_meta( $order->id, 'Bezorg moment', true ) . '</p>'; }
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
这里是我试图将这些值传递给新订单通知的地方:
function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
echo '<p><strong>'.__('Bezorg moment').':</strong> ' . get_post_meta( $order->id, 'Bezorg moment', true ) . '</p>'; }
add_action( 'woocommerce_email_after_order_table', 'custom_woocommerce_email_order_meta_fields', 10, 3 );
但是,无论我尝试什么,标签都会显示在电子邮件中,但变量始终传递一个空值。我无法真正弄明白,因为完全相同的回声确实在前端和仪表板后端正确显示了值。我做错了什么或者电子邮件部分有什么不同?
非常感谢。
WordPress:5.1
WooCommerce:3.5.5
已更新 - 有一些小错误,例如:
- 从 Woocommerce 3 开始,要从订单对象中获取订单 ID,请使用:
$order->get_id()
- 在你的最后一个函数中,钩子函数中缺少一个参数变量,因此你无法获得代码中所需的正确 WC_Order 对象
$order
变量。
- 正确的 post 元键是
可选建议:
- 最好使用 Woocommerce 3 中引入的
woocommerce_checkout_create_order
动作钩子,而不是旧的 woocommerce_checkout_update_order_meta
动作钩子。
- 您可以对
WC_Order
对象使用 WC_Data
get_meta()
方法而不是 get_post_meta()
这是您重新访问的完整代码:
// Display a custom checkout select field after Order notes
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field', 10, 1 );
function my_custom_checkout_field( $checkout ) {
echo '<div id="my_custom_checkout_field">
<h2>' . __('Bezorg moment') . '</h2>';
woocommerce_form_field( 'delivery_date', array(
'type' => 'select',
'options' => array(
'17:30-18:00' => __('17:30 - 18:00', 'woocommerce' ),
'18:00-18:30' => __('18:00 - 18:30', 'woocommerce' )),
'class' => array('my-field-class form-row-wide'),
'label' => __('Bezorgtijd'),
'placeholder' => __('Zo snel mogelijk'),
), $checkout->get_value( 'delivery_date' ));
echo '</div>';
}
// Save the dropdown custom field selected value as order custom meta data:
add_action( 'woocommerce_checkout_create_order', 'my_custom_checkout_field_update_order_meta', 10, 2 );
function my_custom_checkout_field_update_order_meta( $order, $data ) {
if ( isset($_POST['delivery_date']) && ! empty($_POST['delivery_date']) ) {
$order->update_meta_data( 'Bezorg moment', sanitize_text_field( $_POST['delivery_date'] ) );
}
}
// Display the custom field value on admin order pages after billing adress:
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
function my_custom_checkout_field_display_admin_order_meta( $order ) {
echo '<p><strong>'.__('Bezorg moment').':</strong> ' . $order->get_meta('Bezorg moment') . '</p>';
}
// Display the custom field value on email notifications:
add_action( 'woocommerce_email_after_order_table', 'custom_woocommerce_email_order_meta_fields', 10, 4 );
function custom_woocommerce_email_order_meta_fields( $order, $sent_to_admin, $plain_text, $email ) {
echo '<p><strong>'.__('Bezorg moment').':</strong> ' . $order->get_meta('Bezorg moment') . '</p>';
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。
如果您只想定位"New Order"电子邮件通知,请改用此方法:
// Display the custom field value on "New Order" notification:
add_action( 'woocommerce_email_after_order_table', 'custom_woocommerce_email_order_meta_fields', 10, 4 );
function custom_woocommerce_email_order_meta_fields( $order, $sent_to_admin, $plain_text, $email ) {
if( 'new_order' === $email->id )
echo '<p><strong>'.__('delivery_date').':</strong> ' . $order->get_meta('Bezorg moment') . '</p>';
}
我在将自定义字段变量传递到电子邮件收据时遇到了一些问题。我浏览了 Whosebug,但不幸的是,answers/solutions 的 none 对我的情况有所帮助。
我创建的字段确实正确显示在管理仪表板和结帐后页面中,只是不会在任何电子邮件中显示变量。
这里是我在 functions.php 中创建自定义字段的地方:
function my_custom_checkout_field( $checkout ) {
echo '<div id="my_custom_checkout_field"><h2>' . __('Bezorg moment') . '</h2>';
woocommerce_form_field( 'delivery_date', array(
'type' => 'select',
'options' => array(
'17:30-18:00' => __('17:30 - 18:00', 'woocommerce' ),
'18:00-18:30' => __('18:00 - 18:30', 'woocommerce' )),
'class' => array('my-field-class form-row-wide'),
'label' => __('Bezorgtijd'),
'placeholder' => __('Zo snel mogelijk'),
), $checkout->get_value( 'delivery_date' ));
echo '</div>'; }
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );
这是我更新 post 元数据的地方:
function my_custom_checkout_field_update_order_meta( $order_id ) {
if ( ! empty( $_POST['delivery_date'] ) ) {
update_post_meta( $order_id, 'Bezorg moment', sanitize_text_field( $_POST['delivery_date'] ) );
} }
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );
这是我将值传递给管理订单仪表板的地方:
function my_custom_checkout_field_display_admin_order_meta($order){
echo '<p><strong>'.__('Bezorg moment').':</strong> ' . get_post_meta( $order->id, 'Bezorg moment', true ) . '</p>'; }
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
这里是我试图将这些值传递给新订单通知的地方:
function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
echo '<p><strong>'.__('Bezorg moment').':</strong> ' . get_post_meta( $order->id, 'Bezorg moment', true ) . '</p>'; }
add_action( 'woocommerce_email_after_order_table', 'custom_woocommerce_email_order_meta_fields', 10, 3 );
但是,无论我尝试什么,标签都会显示在电子邮件中,但变量始终传递一个空值。我无法真正弄明白,因为完全相同的回声确实在前端和仪表板后端正确显示了值。我做错了什么或者电子邮件部分有什么不同?
非常感谢。
WordPress:5.1 WooCommerce:3.5.5
已更新 - 有一些小错误,例如:
- 从 Woocommerce 3 开始,要从订单对象中获取订单 ID,请使用:
$order->get_id()
- 在你的最后一个函数中,钩子函数中缺少一个参数变量,因此你无法获得代码中所需的正确 WC_Order 对象
$order
变量。 - 正确的 post 元键是
可选建议:
- 最好使用 Woocommerce 3 中引入的
woocommerce_checkout_create_order
动作钩子,而不是旧的woocommerce_checkout_update_order_meta
动作钩子。 - 您可以对
WC_Order
对象使用WC_Data
get_meta()
方法而不是get_post_meta()
这是您重新访问的完整代码:
// Display a custom checkout select field after Order notes
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field', 10, 1 );
function my_custom_checkout_field( $checkout ) {
echo '<div id="my_custom_checkout_field">
<h2>' . __('Bezorg moment') . '</h2>';
woocommerce_form_field( 'delivery_date', array(
'type' => 'select',
'options' => array(
'17:30-18:00' => __('17:30 - 18:00', 'woocommerce' ),
'18:00-18:30' => __('18:00 - 18:30', 'woocommerce' )),
'class' => array('my-field-class form-row-wide'),
'label' => __('Bezorgtijd'),
'placeholder' => __('Zo snel mogelijk'),
), $checkout->get_value( 'delivery_date' ));
echo '</div>';
}
// Save the dropdown custom field selected value as order custom meta data:
add_action( 'woocommerce_checkout_create_order', 'my_custom_checkout_field_update_order_meta', 10, 2 );
function my_custom_checkout_field_update_order_meta( $order, $data ) {
if ( isset($_POST['delivery_date']) && ! empty($_POST['delivery_date']) ) {
$order->update_meta_data( 'Bezorg moment', sanitize_text_field( $_POST['delivery_date'] ) );
}
}
// Display the custom field value on admin order pages after billing adress:
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
function my_custom_checkout_field_display_admin_order_meta( $order ) {
echo '<p><strong>'.__('Bezorg moment').':</strong> ' . $order->get_meta('Bezorg moment') . '</p>';
}
// Display the custom field value on email notifications:
add_action( 'woocommerce_email_after_order_table', 'custom_woocommerce_email_order_meta_fields', 10, 4 );
function custom_woocommerce_email_order_meta_fields( $order, $sent_to_admin, $plain_text, $email ) {
echo '<p><strong>'.__('Bezorg moment').':</strong> ' . $order->get_meta('Bezorg moment') . '</p>';
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。
如果您只想定位"New Order"电子邮件通知,请改用此方法:
// Display the custom field value on "New Order" notification:
add_action( 'woocommerce_email_after_order_table', 'custom_woocommerce_email_order_meta_fields', 10, 4 );
function custom_woocommerce_email_order_meta_fields( $order, $sent_to_admin, $plain_text, $email ) {
if( 'new_order' === $email->id )
echo '<p><strong>'.__('delivery_date').':</strong> ' . $order->get_meta('Bezorg moment') . '</p>';
}