使 Woocommerce (3.8.0) 管理员电子邮件包含结帐页面中的自定义字段数据

Posted

技术标签:

【中文标题】使 Woocommerce (3.8.0) 管理员电子邮件包含结帐页面中的自定义字段数据【英文标题】:Make Woocommerce (3.8.0) admin email include my custom field data from the checkout page 【发布时间】:2020-03-09 21:59:11 【问题描述】:

我在 woocommerce 结帐页面上创建了一些自定义字段。我的代码正确且字段显示正确 我已保存字段数据并将其显示在管理面板中。我的代码正确,字段显示正确。

我已经编写了代码,以便在订购新产品时将这些数据包含在管理员电子邮件中。 我的代码不正确,并且信息未显示在电子邮件中。

有关此主题的所有其他 *** 答案都依赖于已弃用的过滤器 woocommerce_email_order_meta_keys 没有***可以回答woocommerce 3.8.0 woocommerce_email_order_meta_fields 过滤器。

我正在运行 woocommerce 3.8.0 和 wordpress 5.3。 我将这些文件保存在 wp-content/themes/child-theme/functions.php

WTF 我的代码有问题吗?我一遍又一遍地检查它,我无法弄清楚什么是错的。有人可以告诉我我做错了什么吗?我是一名 ruby​​ on rails 开发人员,试图自学 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 

【问题讨论】:

【参考方案1】:

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_fields 函数有错误。您错误地调用了订单 ID。错误日志将显示这一点。不应直接调用订单属性。所以你必须将$order-&gt;id 更改为$order-&gt;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 函数中添加的。

【讨论】:

天哪,你解决了。如果我和你在同一个房间,我会亲吻你走过的土地。还要感谢 WP_DEBUG 提示。这将在未来节省大量时间。 @davidlee 哦。 . .这是我很久以后听到的最好的话:) 每个人都应该得到帮助。这就是每个人的成长方式;)

以上是关于使 Woocommerce (3.8.0) 管理员电子邮件包含结帐页面中的自定义字段数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使woocommerce产品标签分层?

使 WooCommerce 缩略图图像大于主要产品图像

如何使复选框默认选中?在 Woocommerce 结帐中

php [WooCommerce Core]使地址字段更广泛

php [WooCommerce Core]使地址字段更广泛

woocommerce 自定义产品类型 - 使变化成为可能