在 Woocommerce 中捕获自定义结帐字段值

Capture custom checkout field value in Woocommerce

我在 woocommerce 上,正在尝试使用代码片段,使用 json 获取所有字段的值以发送到 adroid 应用程序。

麻烦的是,我无法在结帐时捕获自定义字段的值。我尝试通过插件和代码片段创建字段,但是我无法恢复要发送到 json

的值

该字段是使用该代码段创建的

add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );

function my_custom_checkout_field( $checkout ) {

echo '<div id="my_custom_checkout_field"><h2>' . __('My Field') . '</h2>';

woocommerce_form_field( 'my_field_name', array(
    'type'          => 'text',
    'class'         => array('my-field-class form-row-wide'),
    'label'         => __('Fill in this field'),
    'placeholder'   => __('Enter something'),
    ), $checkout->get_value( 'my_field_name' ));

echo '</div>';

}

当尝试使用该片段创建 json 时,我可以获得所有标准 woo 值,但我无法获得自定义字段

function action_woocommerce_order_status_completed( $array ) { 

$order = wc_get_order( $order_id );
$url = 'localhost/wp/recolector.php';

//Initiate cURL.
$ch = curl_init($url);

// now you can get the data from $product array
};

 //The JSON data.
$jsonData = array(
'email' => $order->get_billing_email(),
'first_name'=> $order->get_billing_first_name(),
'last_name' => $order->get_billing_last_name(),
'phone'=>$order->get_billing_phone()(),
'address'=>$order->get_billing_address_1(),
'city'=>$order->get_billing_city(),
'province'=>$order->get_billing_state(),
'country'=>$order->get_billing_country(),
'order'=>$order->get_order_number()
);

//Encode the array into JSON.
$jsonDataEncoded = json_encode($jsonData);

//Tell cURL that we want to send a POST request.
curl_setopt($ch, CURLOPT_POST, 1);

//Attach our encoded JSON string to the POST fields.
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded);

//Set the content type to application/json
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 

//Execute the request
$result = curl_exec($ch);


};

// add the action
add_action( 'woocommerce_order_status_completed', 'action_woocommerce_order_status_completed', 10, 1 ); 

那么如何将 my_field_name 添加到 json?

感谢您的帮助。

已更新

您的代码中存在一些错误和缺失。请尝试以下操作:

// Display a custom checkout field
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );
function my_custom_checkout_field( $checkout ) {
    echo '<div id="my_custom_checkout_field"><h2>' . __('My Field') . '</h2>';

    woocommerce_form_field( '_custom_field', array(
        'type'          => 'text',
        'class'         => array('my-custom-field form-row-wide'),
        'label'         => __('Fill in this field'),
        'placeholder'   => __('Enter something'),
        ), $checkout->get_value( '_custom_field' ));

    echo '</div>';
}

// Save the custom checkout field in the order meta
add_action( 'woocommerce_checkout_create_order', 'save_order_custom_meta_data', 10, 2 );
function save_order_custom_meta_data( $order, $data ) {
    if ( isset($_POST['_custom_field']) )
        $order->update_meta_data('_custom_field', sanitize_text_field( $_POST['_custom_field'] ) );
}


add_action( 'woocommerce_order_status_completed', 'action_on_order_status_completed', 10, 2 ); 
function action_on_order_status_completed( $order_id, $order ) { 
    // The order data (array)
    $data = array(
        'email'         => $order->get_billing_email(),
        'first_name'    => $order->get_billing_first_name(),
        'last_name'     => $order->get_billing_last_name(),
        'phone'         => $order->get_billing_phone()(),
        'address'       => $order->get_billing_address_1(),
        'city'          => $order->get_billing_city(),
        'province'      => $order->get_billing_state(),
        'country'       => $order->get_billing_country(),
        'order'         => $order->get_order_number()
    );

    // Get the custom field value (and add it if not empty)
    if( $custom_field = $order->get_meta('_custom_field') ) {
        // Add it to the array
        $data['custom_field'] = $custom_field;
    }

    //Encode the array into JSON.
    $json_data = json_encode( $data ); 

    // The Url
    $url = 'localhost/wp/recolector.php';

    //Initiate cURL.
    $ch = curl_init($url);

    //Tell cURL that we want to send a POST request.
    curl_setopt($ch, CURLOPT_POST, 1);

    //Attach our encoded JSON string to the POST fields.
    curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded);

    //Set the content type to application/json
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 

    //Execute the request
    $result = curl_exec($ch);

    // Set the return result in the order as custom meta data (if needed)
    $order->update_meta_data('_curl_result', $result );
    $order->save();
}

现在应该可以更好地工作了。