【问题标题】:Display editable custom fields values in Woocommerce edit order page在 Woocommerce 编辑订单页面中显示可编辑的自定义字段值
【发布时间】:2018-07-02 18:46:02
【问题描述】:

我不是开发人员,但以某种方式设法将 Woocommerce 自定义字段添加到结帐和订单编辑页面。有类似的问题,但我找不到正确的解决方案。

自定义字段在管理员订单编辑页面中可见但它们不显示值并且不会添加到订单电子邮件中。

我错过了什么?

请看最后的截图。

这是所有代码放在一起:

// Woocommerce - Add user custom billing fields
// =============================================================================

function add_woocommerce_admin_billing_fields($billing_fields) {
    $billing_fields['billing_birthday'] = array(
        'label' => __('Datum rojstva', 'woocommerce')
    );
    $billing_fields['billing_socialno'] = array(
        'label' => __('Davčna številka', 'woocommerce')
    );

    return $billing_fields;
}
add_filter('woocommerce_admin_billing_fields', 'add_woocommerce_admin_billing_fields');

function add_woocommerce_found_customer_details($customer_data, $user_id, $type_to_load) {
    if ($type_to_load == 'billing') {
        $customer_data[$type_to_load . 'billing_birthday'] = get_user_meta($user_id, $type_to_load . 'billing_birthday', true);
        $customer_data[$type_to_load . 'billing_socialno'] = get_user_meta($user_id, $type_to_load . 'billing_socialno', true);

    }
    return $customer_data;
}
add_filter('woocommerce_found_customer_details', 'add_woocommerce_found_customer_details', 10, 3);

function add_woocommerce_billing_fields($billing_fields) {
    $billing_fields['billing_birthday'] = array(
        'type' => 'tel',
        'label' => __('Datum rojstva'),
        'value' => get_post_meta( $order->id, 'billing_birthday', true ),
        'placeholder' => __('dd/mm/yyyy', 'placeholder'),
        'pattern' => __('\d{1,2}/\d{1,2}/\d{4}', 'pattern' ),
        'class' => array('form-row-first'),
        'required' => true,
        'clear' => true

    );
    $billing_fields['billing_socialno'] = array(
        'type' => 'tel',
        'label' => __('Davčna številka'),
        'value' => get_post_meta( $order->id, 'billing_socialno', true ),
        'placeholder' => _x('8-mestna številka', 'placeholder'),
        'class' => array('form-row-last'),
        'required' => false,
        'clear' => true
    );

    return $billing_fields;
}
add_filter('woocommerce_billing_fields', 'add_woocommerce_billing_fields');

//Doda user meta v backend profil
function add_woocommerce_customer_meta_fields($billing_fields) {
    if (isset($billing_fields['billing']['fields'])) {
        $billing_fields['billing']['fields']['billing_birthday'] = array(
            'label' => __('Datum rojstva', 'woocommerce'),
            'description' => 'Pa kaj bo končno ratalo memo milo?'
        );
        $billing_fields['billing']['fields']['billing_socialno'] = array(
            'label' => __('Davčna številka', 'woocommerce'),
            'description' => ''
        );

    }
    return $billing_fields;
}
add_filter('woocommerce_customer_meta_fields', 'add_woocommerce_customer_meta_fields');

function add_woocommerce_order_fields($address, $order) {
    $address['billing_birthday'] = $order->billing_birthday . get_post_meta($order->id, '_billing_birthday', true) ;
    $address['billing_socialno'] = $order->billing_socialno;
    return $address;
}
add_filter('woocommerce_order_formatted_billing_address', 'add_woocommerce_order_fields', 10, 2);

function add_woocommerce_formatted_address_replacements($replace, $args) {
    $replace['{billing_birthday}'] = !empty($args['billing_birthday']) ? 'Datum rojstva' . $args['billing_birthday'] : '';
    $replace['{billing_socialno}'] = !empty($args['billing_socialno']) ? 'Davčna številka' . $args['billing_socialno'] : '';
    return $replace;
}
add_filter('woocommerce_formatted_address_replacements', 'add_woocommerce_formatted_address_replacements', 10, 2);

function add_woocommerce_localisation_address_formats($formats) {
    $formats['default'] = $formats['default'] . "\n{billing_birthday}\n{billing_socialno}";
    return $formats;
}
add_filter('woocommerce_localisation_address_formats', 'add_woocommerce_localisation_address_formats', 10, 1);

// Change field type to tel woocommerce checkout

function bbloomer_change_checkout_field_input_type() {
echo "<script>document.getElementById('billing_postcode').type = 'tel';</script>";
echo "<script>document.getElementById('billing_birthday').type = 'tel';</script>";

}

add_action( 'woocommerce_after_checkout_form', 'bbloomer_change_checkout_field_input_type'); 

订单编辑页面截图

【问题讨论】:

    标签: php wordpress woocommerce checkout orders


    【解决方案1】:

    如果您想添加自定义字段,不仅仅是添加新的账单详细信息,而且无论如何都非常简单。

    我推荐你使用钩子woocommerce_admin_order_data_after_billing_address,所以它会是这样的:

    add_action( 'woocommerce_admin_order_data_after_billing_address', 'mishafunction' );        
    function mishafunction( $order ){        
        $x = get_post_meta( $order->get_order_number(), 'CUSTOM FIELD NAME', true );
        ?>
        <div class="address">
        <p<?php if( !$x ) echo ' class="none_set"' ?>>
            <strong>Datum rojstva:</strong>
            <?php echo ( $x ) ? $x : '' ?>
        </p>
        </div>
        <div class="edit_address"><?php
        woocommerce_wp_text_input( array(
            'id' => 'CUSTOM FIELD NAME',
            'label' => 'Datum rojstva:',
            'value' => $x,
            'wrapper_class' => 'form-field-wide'
        ) );
        ?></div><?php
    }
    
    add_action( 'woocommerce_process_shop_order_meta', 'misha_save_it' );
    
    function misha_save_it( $order_id ){
        update_post_meta( $order_id, 'CUSTOM FIELD NAME', wc_clean( $_POST[ 'CUSTOM FIELD NAME' ] ) );
    }
    

    您也可以查看完整教程here

    【讨论】:

    【解决方案2】:

    我已经测试了您的代码,只是有一些小错误。你很接近让它按你期望的方式工作。所以您应该需要对以下代码进行一些更改:

    1) 删除了“值”,因为这个钩子函数适用于结帐并且不需要值(当您尝试从不存在的订单中获取它们时更不用说)。

    这将避免隐藏的错误,并在客户已经填写了之前购买的字段时显示正确的值……

    // Add custom Checkout billing fields
    add_filter('woocommerce_billing_fields', 'add_woocommerce_billing_fields', 20, 1);
    function add_woocommerce_billing_fields( $billing_fields ) {
    
        $billing_fields['billing_birthday'] = array(
            'type' => 'tel',
            'label' => __('Datum rojstva'),
            'placeholder' => __('dd/mm/yyyy', 'placeholder'),
            'pattern' => __('\d{1,2}/\d{1,2}/\d{4}', 'pattern' ),
            'class' => array('form-row-first'),
            'required' => true,
            'clear' => true
        );
    
        $billing_fields['billing_socialno'] = array(
            'type' => 'tel',
            'label' => __('Davčna številka'),
            'placeholder' => _x('8-mestna številka', 'placeholder'),
            'class' => array('form-row-last'),
            'required' => false,
            'clear' => true
        );
    
        return $billing_fields;
    }
    
    // Change field type to tel for woocommerce checkout
    add_action( 'woocommerce_after_checkout_form', 'change_checkout_field_input_type');
    function change_checkout_field_input_type() {
        echo "<script>document.getElementById('billing_postcode').type = 'tel';</script>";
        echo "<script>document.getElementById('billing_birthday').type = 'tel';</script>";
    }
    

    2) 此处的键有误,因此这就是为什么字段值不会显示在管理员订单编辑页面中的原因

    它是'birthday''socialno',而不是'billing_birthday''billing_socialno'

    // Setting custom fields Keys/Labels pairs in admin edit order pages and allow edit this fields correctly.
    add_filter('woocommerce_admin_billing_fields', 'add_woocommerce_admin_billing_fields');
    function add_woocommerce_admin_billing_fields($billing_fields) {
        $billing_fields['birthday'] = array( 'label' => __('Datum rojstva', 'woocommerce') );
        $billing_fields['socialno'] = array( 'label' => __('Davčna številka', 'woocommerce') );
    
        return $billing_fields;
    }
    

    3) 正确获取缺少的字段值以显示在订单编辑页面中。

    // Get the field values to be displayed in admin Order edit pages
    add_filter('woocommerce_order_formatted_billing_address', 'add_woocommerce_order_fields', 10, 2);
    function add_woocommerce_order_fields($address, $order ) {
        $address['billing_birthday'] = get_post_meta( $order->get_id(), '_billing_birthday', true );
        $address['billing_socialno'] = get_post_meta( $order->get_id(), '_billing_socialno', true );
        return $address;
    }
    

    4) 其他未更改的挂钩函数:

    //Doda user meta v backend profil
    add_filter('woocommerce_customer_meta_fields', 'add_woocommerce_customer_meta_fields');
    function add_woocommerce_customer_meta_fields($fields) {
        if (isset($fields['billing']['fields'])) {
            $fields['billing']['billing_birthday'] = array(
                'label' => __('Datum rojstva', 'woocommerce'),
                'description' => 'Pa kaj bo končno ratalo memo milo?'
            );
            $fields['billing']['billing_socialno'] = array(
                'label' => __('Davčna številka', 'woocommerce'),
                'description' => ''
            );
        }
        return $fields;
    }
    
    add_filter( 'woocommerce_found_customer_details', 'add_woocommerce_found_customer_details', 10, 3);
    function add_woocommerce_found_customer_details($customer_data, $user_id, $type_to_load) {
        if ($type_to_load == 'billing') {
            $customer_data[$type_to_load . 'billing_birthday'] = get_user_meta($user_id, $type_to_load . 'billing_birthday', true);
            $customer_data[$type_to_load . 'billing_socialno'] = get_user_meta($user_id, $type_to_load . 'billing_socialno', true);
    
        }
        return $customer_data;
    }
    
    //add_filter('woocommerce_formatted_address_replacements', 'add_woocommerce_formatted_address_replacements', 10, 2);
    function add_woocommerce_formatted_address_replacements($replace, $args) {
        $replace['{billing_birthday}'] = !empty($args['billing_birthday']) ? 'Datum rojstva' . $args['billing_birthday'] : '';
        $replace['{billing_socialno}'] = !empty($args['billing_socialno']) ? 'Davčna številka' . $args['billing_socialno'] : '';
        return $replace;
    }
    
    add_filter('woocommerce_localisation_address_formats', 'add_woocommerce_localisation_address_formats', 10, 1);
    function add_woocommerce_localisation_address_formats($formats) {
        $formats['default'] = $formats['default'] . "\n{billing_birthday}\n{billing_socialno}";
        return $formats;
    }
    

    代码进入活动子主题(或活动主题)的 function.php 文件中。


    电子邮件通知 - 显示自定义字段(及其标签)。

    通过您的活动子主题覆盖 Woocommerce 模板 emails/email-addresses.php

    此模板可以通过从以下位置复制来覆盖:
    plugin/woocommerce/templates/emails/email-addresses.php
    yourtheme/woocommerce/emails/email-addresses.php...
    官方文档:Template structure & Overriding templates via a theme

    您将在第 34 行之后(就在计费电话之后)插入以下内容:

    <?php
        // Billing birthday
        $billing_birthday = get_post_meta($order->get_id(), '_billing_birthday', true );
        echo $billing_birthday ? '<br/>'.__('Datum rojstva', 'woocommerce').': '.$billing_birthday : '';
    
        // Billing socialno
        $billing_socialno = get_post_meta($order->get_id(), '_billing_socialno', true );
        echo $billing_socialno ? '<br/>'.__('Davčna številka', 'woocommerce').': '.$billing_socialno : '';
    ?>
    

    经过测试并且有效。

    【讨论】:

    • 感谢您的回答。在管理订单编辑页面和我的帐户页面中,一切都像魅力一样!但是,如果我使用您的 sn-p,后端配置文件中的字段将不再显示......我真的很想拥有更正/更新客户数据的选项。所以现在我只是更正了键并保留了我的代码 - 带有值。
    • @MarkOgner 我不太明白你的意思。我的回答只是回答您的问题:在 Woocommerce 编辑订单页面中显示可编辑的自定义字段值。所以你可以接受这个答案,因为它真的很复杂,而且它正在回答你的问题。现在你可以做的是在你的问题末尾添加一个编辑,解释你需要什么,这不适用于我的代码(如有必要,可以使用屏幕截图)。这样我也将编辑我的答案代码,你让它完全工作......谢谢。
    • 我非常感谢你所做的。洛伊克。我只是想让你知道我在哪里,因为我没有时间寻找出现问题的原因。也许我删除了一些我不应该一路走来的东西。所以-谢谢你,我会尽快编辑问题。并且请让我放松一下,因为我对所有这些 stackoverflow 东西都很陌生,而且我边走边学。 ?
    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2018-03-18
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2021-11-10
    相关资源
    最近更新 更多