【问题标题】:How to get the value instead of order_id with get_post_meta()如何使用 get_post_meta() 获取值而不是 order_id
【发布时间】:2015-05-13 14:40:45
【问题描述】:

我有以下代码在 woocommerce 结帐中添加自定义订单字段:

add_filter('woocommerce_checkout_fields', 'custom_override_checkout_fields');
function custom_override_checkout_fields($fields) {
   $fields['billing']['billing_reason_for_purchase'] = array(
       'label' => __('Reason for purchase', 'woocommerce'),
       'placeholder' => _x('Reason for purchase', 'placeholder', 'woocommerce'),
       'required' => false,
       'type' => 'select',
       'class' => array('form-row-first'),
       'options' => array(
           'option_1' => __('Personal', 'woocommerce'),
           'option_2' => __('Academic', 'woocommerce'),
           'option_3' => __('Small Business', 'woocommerce'),
           'option_4' => __('Large Organization', 'woocommerce')
       )
   );
   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(!empty($_POST['billing_reason_for_purchase'])) {
        update_post_meta($order_id,'Reason for purchase',sanitize_text_field($_POST['billing_reason_for_purchase']));
    }
}

接下来,在订单编辑页面显示该字段:

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>'.__('Reason for purchase').':<strong>'.get_post_meta($order->id, 'Reason for purchase',true).'</p>';
    echo '<p><strong>'.__('Reason for purchase').':<strong>'.get_post_meta(get_the_ID(), 'Reason for purchase',true).'</p>';
}

我遇到的问题是,如果我创建了一个选择“学术”作为购买原因的虚拟订单,我会在订单编辑页面中得到“option_2”而不是“学术”。

请帮我指出正确的方向。

【问题讨论】:

    标签: wordpress woocommerce


    【解决方案1】:

    发生这种情况是因为所选选项的值(以及 $_POST['billing_reason_for_purchase'] 的值)实际上是数组的键(在您的示例中为 option_2),而不是与文本相关的键。实际上这是创建的选项标签:

    <option value="option_2">Academic</option>
    

    您只保存了数组的键。

    因此,即使在 my_custom_checkout_field_display_admin_order_meta 函数上,您也需要检索选项数组以获得正确的文本。

    您可以在每个函数中复制数组(但不方便复制代码),或者将其放在全局变量中以便能够从任何地方访问它(但其他东西可能会改变它),因此您可以使用返回数组的函数:

    function reasons_for_purchase () {
        return array(
           'option_1' => __('Personal', 'woocommerce'),
           'option_2' => __('Academic', 'woocommerce'),
           'option_3' => __('Small Business', 'woocommerce'),
           'option_4' => __('Large Organization', 'woocommerce')
       );
    }
    

    然后在需要的地方使用它:

    add_filter('woocommerce_checkout_fields','custom_override_checkout_fields');
    function custom_override_checkout_fields($fields) {
       $fields['billing']['billing_reason_for_purchase'] = array(
           'label' => __('Reason for purchase', 'woocommerce'),
           'placeholder' => _x('Reason for purchase', 'placeholder', 'woocommerce'),
           'required' => false,
           'type' => 'select',
           'class' => array('form-row-first'),
           'options' => reasons_for_purchase()
       );
       return $fields;
    }
    
    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){
        $reasons = reasons_for_purchase();
        $reason  = get_post_meta($order->id, 'Reason for purchase', true);
        if( isset($reasons[$reason]) )
            echo '<p><strong>'.__('Reason for purchase').':</strong> '. $reasons[$reason] .'</p>';
    }
    

    【讨论】:

    • 谢谢 d79。它就像一个魅力。干得好 :) 喜欢投票给你,但需要更多的声誉
    • 太好了,我很高兴! :) 也许不会投票,但您可以通过单击复选标记accept the answer。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。这是你的选择;)
    猜你喜欢
    • 1970-01-01
    • 2020-06-12
    • 2014-05-13
    • 2021-05-18
    • 1970-01-01
    • 2020-10-30
    • 2018-04-23
    • 1970-01-01
    • 2012-08-10
    相关资源
    最近更新 更多