wordpress 如何使用get_post_ meta()获取值而不是order_id

w41d8nur  于 2023-03-29  发布在  WordPress
关注(0)|答案(2)|浏览(159)

我有以下代码来在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;
}

然后,执行下面的代码,用字段值更新订单 meta

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”而不是“学术”。
请帮我指出正确的方向。

bvhaajcl

bvhaajcl1#

这是因为所选选项的值(以及$_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>';
}
i1icjdpr

i1icjdpr2#

关于d 79提供的出色的解决方案,它的工作形成后,一些调整的语法。它可能没有工作,我最初可能是因为过时的语法,所以我会尝试列出的变化,我已经作出,并为我工作。
1).正在更新选项数组语法:

'option_1' => __('Personal', 'woocommerce'),

'option_1' => 'Personal',

2).更新get_post_ meta语法:

get_post_meta($order->id,

get_post_meta($order->get_id(),

3).改变get_post_ meta中的第二个变量,因为对我来说,它最初并没有输出所选选项的数组键。所以基本上起作用的是,使用字段名称作为第二个变量,前面有一个“_”符号。作为一个例子。我为变量“$reason”添加了整个代码行,这说明了变化。

$reason  = get_post_meta($order->id, 'Reason for purchase', true);

$reason  = get_post_meta($order->get_id(), '_billing_reason_for_purchase', true);

相关问题