2015-05-13 31 views
0

我有下面的代碼在woocommerce結賬添加自定義命令字段get_post_meta():如何獲得的價值,而不是與ORDER_ID

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」而不是「學術」。

請幫我指點正確的方向。

回答

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>'; 
} 
+0

謝謝d79.It就像一個魅力。做得好:)愛給你投票,但需要更多的聲譽 – magicrock

+0

太好了,我很高興! :)也許不投票,但你可以[接受答案](http://meta.stackexchange.com/a/5235)通過點擊複選標記。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。這是你的選擇;) – d79

+0

完成。非常感謝你 – magicrock