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

Php 使Woocommerce(3.8.0)管理员电子邮件包含结帐页面中的自定义字段数据,php,wordpress,woocommerce,custom-fields,child-theming,Php,Wordpress,Woocommerce,Custom Fields,Child Theming,我在woocommerce结帐页面上创建了一些自定义字段。我的代码正确,字段显示正确 我已经保存了字段数据并将其显示在管理面板中。我的代码正确,字段显示正确 我已经编写了代码,以便在订购新产品时将此数据包含在管理员电子邮件中。 我的代码不正确,信息未显示在电子邮件中 有关此主题的所有其他stackoverflow答案都依赖于不推荐使用的筛选器 woocommerce\u email\u order\u meta\u keys 在woocommerce 3.8.0woocommerce\u ema

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

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

有关此主题的所有其他stackoverflow答案都依赖于不推荐使用的筛选器
woocommerce\u email\u order\u meta\u keys
在woocommerce 3.8.0
woocommerce\u email\u order\u meta\u字段中没有堆栈溢出
过滤器

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

我的代码有问题吗?我已经检查了一次又一次,我不知道出了什么问题。有人能告诉我我做错了什么吗?我是一名RubyonRails开发人员,试图自学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;
}
然后,我用以下代码将其添加到Woocomece签出页面

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 }

add_action('woocommerce_后面的_checkout_billing_form','isca_extra_checkout_fields');
函数isca\u extra\u checkout\u fields(){
$checkout=WC()->checkout();?>


WordPress有一个打开调试模式的选项,以便识别和解决错误和警告。当您的代码出错时,错误将记录在WordPress文件夹的
wp content
文件夹中名为
debug.log
的文件中。因此,在WordPress中开发时,您必须打开三个选项。 转到wp-config.php并添加这三行代码

define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
您的
自定义\u商业\u电子邮件\u订单\u元\u字段
s函数有错误。您错误地调用了订单id。错误日志将显示。订单属性不应直接调用。因此,您必须将
$order->id
更改为
$order->get\u 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;
}

这是我在
自定义\u woocommerce\u email\u order\u meta\u字段中添加的功能。

天哪,你解决了它。如果我和你在同一个房间,我会亲吻你走过的地面。还要感谢WP\u调试提示。这将在未来节省大量时间。@davidele ohh…这是我很久以来听到的最好的话:)每个人e值得帮助。这就是每个人成长的方式;)