显示结帐 ACF 高级自定义字段并将值保存在 WooCommerce 中

问题描述 投票:0回答:2

我正在尝试向结帐页面添加其他字段。我已经设置了 ACF 字段并可以将它们显示在结帐页面上(通过 acf_form),但是当我下订单时,我在字段中输入的值不会延续到创建的订单中。

这是我用来显示和更新字段的代码:

    add_action( 'woocommerce_after_order_notes', 'my_acf_checkout_display' ); 

function my_acf_checkout_display() { 
    acf_form(array('form' => false,'fields' => array('inseam'))); 
}

add_action( 'woocommerce_checkout_update_order_meta','acf_update_field_at_checkout' );
  
function acf_update_field_at_checkout( $order_id ) {
        
        // acf custom field id
        $my_field = 'inseam';
    
        $acf_form_value = $_POST['acf'][$my_field];
        update_field($my_field,$acf_form_value,$order_id);

}

在这里您可以看到我如何设置字段: Field Setup

我的结帐页面如下所示: Checkout Page

这是订单中的“已更新”字段(仍为空):

Backend Order Fields

当我将值硬编码为 12 时,它就可以工作了!

    add_action( 'woocommerce_after_order_notes', 'my_acf_checkout_display' ); 

function my_acf_checkout_display() { 
    acf_form(array('form' => false,'fields' => array('inseam'))); 
}

add_action( 'woocommerce_checkout_update_order_meta','acf_update_field_at_checkout' );
  
function acf_update_field_at_checkout( $order_id ) {
        
        // acf custom field id
        $my_field = 'inseam';
        $acf_form_value = 12;
        //$acf_form_value = $_POST['acf'][$my_field];
        update_field($my_field,$acf_form_value,$order_id);

}

有谁知道为什么它没有将输入的内缝值填充到订单中?

提前非常感谢您!

php wordpress woocommerce advanced-custom-fields orders
2个回答
2
投票

您没有使用与 ACF 一起使用的正确字段 ID。

首先在管理 ACF 字段组中单击“屏幕选项”:

enter image description here

然后选择显示字段“slug”和“Field Key”选项。

enter image description here

现在您可以获得正确的“字段密钥”以在代码中使用...

所以这是我测试过的代码,重现您的设置(在代码中替换“Inseam”字段的正确字段键

// Displaying ACF field in Checkout after order notes
add_action( 'woocommerce_after_order_notes', 'checkout_display_acf_field' ); 
function checkout_display_acf_field() { 
    $acf_field_key = 'field_648715e6451d1'; // Here set the field Key

    acf_form( array(
        'form' => false, 
        'fields' => array( $acf_field_key )
    ) ); 
}

add_action( 'woocommerce_checkout_update_order_meta', 'acf_update_checkout_field' );
function acf_update_checkout_field( $order_id ) {
    $acf_field_key = 'field_648715e6451d1'; // Here set the field Key
    
    if ( isset($_POST['acf'][$acf_field_key]) ) {
        $acf_field_value = sanitize_text_field( $_POST['acf'][$acf_field_key] );
        update_field( $acf_field_key, $acf_field_value, $order_id ); 
    }
}

代码位于活动子主题(或活动主题)的functions.php 文件中。已测试并有效。

现在该字段将显示在订单页面的管理员中以及提交的值。


处理多个高级自定义字段 以干净的方式

首先,我在 ACF 字段组设置中设置了 2 个字段:

enter image description here

然后这是代码:

add_action( 'woocommerce_after_order_notes', 'checkout_display_acf_field' ); 
function checkout_display_acf_field() { 
    $acf_field_key_arr = array ( // Here set the all required fields Keys in the array
        'field_648715e6451d1',
        'field_64873b2d5f57d'
    );
    
    // Loop through each field key in the array
    foreach ( $acf_field_key_arr as $acf_field_key ) {
        acf_form( array(
            'form' => false, 
            'fields' => array( $acf_field_key )
        ) );
    }
}

add_action( 'woocommerce_checkout_update_order_meta', 'acf_update_checkout_field' );
function acf_update_checkout_field( $order_id ) {
    $acf_field_key_arr = array (  // Here set the all required fields Keys in the array
        'field_648715e6451d1',
        'field_64873b2d5f57d'
    );
    
    // Loop through each field key in the array
    foreach ( $acf_field_key_arr as $acf_field_key ) {
        if ( isset($_POST['acf'][$acf_field_key]) ) {
            $acf_field_value = sanitize_text_field( $_POST['acf'][$acf_field_key] );
            update_field( $acf_field_key, $acf_field_value, $order_id ); 
        }
    }
}

代码位于活动子主题(或活动主题)的functions.php 文件中。已测试并有效。

结账页面显示:

enter image description here


0
投票

这段代码对我来说非常有用——但我还想在加载结帐表单时从 ACF 用户字段加载现有值(如果存在)。我似乎无法弄清楚。

© www.soinside.com 2019 - 2024. All rights reserved.