将自定义发布的变量从页面传递到Woocommerce订单数据

乔恩

我可以使用这样的代码向WooCommerce订单添加自定义变量-但前提是该代码位于产品页面上:

<form action="<?php echo esc_url( wc_get_checkout_url() ); ?>" method="post">   
    <?php
  $value = isset( $_POST['dogname'] ) ? sanitize_text_field( $_POST['dogname'] ) : '';
    echo '<div><label>Name of Dog</label><p><input name="dogname" value="' . $value . '"></p></div>';
?>  <button type="submit">Checkout</button> 
    </form>

但是,如果我不在产品页面上,如何将数据添加到订单中呢?添加到购物车后,我将页面重定向到自定义页面。在此自定义页面上,购物车中已经装有产品。但是在自定义页面上提交此表单-可以结帐,但不会更新变量或将变量添加到订单中。如何从自定义页面使用自定义变量更新订单?

也许我需要按钮的一些额外代码来更新点击的顺序?

我将为按钮使用什么代码-单击后将把表单值发布到我的订单中,并定向到另一个页面?

LoicTheAztec

下面是在不丢失此发布数据的情况下,使结帐页面和其他任何地方可用的发布数据的方法。为此,我们将发布的数据设置为WC会话变量,因此可以在需要时随时使用此发布的数据。

页面上的表单 (带有多个字段的示例)

?><form action="<?php echo esc_url( wc_get_checkout_url() ); ?>" method="post">
    <?php
    $dogname  = isset( $_POST['dogname'] ) ? sanitize_text_field( $_POST['dogname'] ) : '';
    $dogcolor = isset( $_POST['dogcolor'] ) ? sanitize_text_field( $_POST['dogcolor'] ) : '';
    ?>
    <div><label><?php _e("Name of Dog");  ?></label><p><input name="dogname"  value="<?php echo $dogname;  ?>"></p></div>
    <div><label><?php _e("Color of Dog"); ?></label><p><input name="dogcolor" value="<?php echo $dogcolor; ?>"></p></div>
    <button class="button" type="submit" name="dog_form" value="submited"><?php _e("Checkout"); ?></button>
</form><?php

将发布的数据设置为WC_Session变量的代码

// Early enable customer WC_Session
add_action( 'init', 'wc_session_enabler' );
function wc_session_enabler() {
    if ( is_user_logged_in() || is_admin() )
        return;

    if ( isset(WC()->session) && ! WC()->session->has_session() ) {
        WC()->session->set_customer_session_cookie( true );
    }
}

// Set posted data in a WC session variable
add_action( 'template_redirect', 'set_custom_posted_data_to_wc_session' );
function set_custom_posted_data_to_wc_session() {
    if ( is_checkout() && ! is_wc_endpoint_url() ) {
        if ( isset($_POST['dog_form']) ) {
            $values = array(); // Initializing

            if ( isset($_POST['dogname']) && ! empty($_POST['dogname']) ) {
                $values['dogname'] = sanitize_text_field($_POST['dogname']);
            }

            if ( isset($_POST['dogcolor']) && ! empty($_POST['dogcolor']) ) {
                $values['dogcolor'] = sanitize_text_field($_POST['dogcolor']);
            }

            // Set data to a WC_Session variable
            if ( ! empty($values) ) {
                WC()->session->set('custom_data', $values);
            }
        }
    }
}

代码进入活动子主题(或活动主题)的functions.php文件中。经过测试和工作。

然后,您可以使用以下任何功能或模板获取该数据:

$values   = WC()->session->get('custom_data');
$dogname  = isset($values['dogname']) ? $values['dogname'] : '';
$dogcolor = isset($values['dogcolor']) ? $values['dogcolor'] : '';

将数据保存到订单详细信息:

// Save WC session data as custom order meta data
add_action( 'woocommerce_checkout_create_order', 'action_checkout_add_custom_order_meta', 10, 2 );
function action_checkout_add_custom_order_meta( $order, $data ) {
    $values = WC()->session->get('custom_data'); // Get data from WC Session variable

    if( ! empty($values) ) {
        if ( isset($values['dogname']) ) {
            $order->update_meta_data( '_dogname', $values['dogname'] ); // Set dog name to order details
        }
        if ( isset($values['dogcolor']) ) {
            $order->update_meta_data( '_dogcolor', $values['dogcolor'] ); // Set dog color to order details
        }
        // Remove the WC_Session variable (as we don't need it anymore)
        WC()->session->__unset('custom_data');
    }
}

代码进入活动子主题(或活动主题)的functions.php文件中。

然后,您可以使用以下命令从WC_Order对象订单中获取该数据:

$order = wc_get_order( $order_id ); // If needed, get the WC_Order object from order Id

$dogname  = $order->get_meta('_dogname');
$dogcolor = $order->get_meta('_dogcolor');

就像在此挂钩函数中一样,该函数将在“已收到订单”页面上显示数据:

add_action( 'woocommerce_thankyou', 'thankyou_display_dog_data' ); 
function dog( $order_id ) { 
    
    $order = wc_get_order( $order_id ); // Get an instance of the WC_Order object
    
    $dog_name  = $order->get_meta('_dogname');
    $dog_color = $order->get_meta('_dogcolor');
     
    echo ! empty($dog_name) ? '<p>' . $dog_name .'<p>' : ''; 
    echo ! empty($dog_color) ? '<p>' . $dog_color .'<p>' : ''; 
} 

经过测试,可以在最新的WooCommerce版本上使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何自定义Woocommerce产品页面中的订单数量输出

将自定义产品元数据传递到Woocommerce 4中的订单

将自定义产品元数据传递到Woocommerce 3中的订单

在 WooCommerce PDF 发票和装箱单中的订单数据之后添加自定义元数据

在Woocommerce中按状态和自定义ACF字段显示订单数量

PHP 中的自定义订单数组

如何从订单数组访问自定义数据(使用插件添加)?

将自定义用户字段传递给WooCommerce订单元数据

将自定义帐单数据添加到Woocommerce管理订单中的帐单格式地址中

ModelBinding到DataTables订单数据

在Woocommerce 3中将自定义元数据添加到管理订单编辑页面

将自定义变量属性传递到foreach语句

WooCommerce:将自定义Metabox添加到管理订单页面

在WooCommerce中将自定义URL链接添加到管理订单列表页面

在Thanyou页面上嵌入带有订单数据的JS脚本WooCommerce

Swift中带有自定义对象的订单数组

无法从woocommerce中的订单的购物车页面到结帐页面获取自定义字段数据

将自定义元数据保存到Shipstation的WooCommerce订单

将自定义字段数据添加到WooCommerce订单

Woocommerce 订单数据未显示,例如送货地址

Qt Woocommerce API 返回之前的订单数据

如何获取更新的 WooCommerce 订单数据?

Woocommerce AJAX API未将自定义产品字段发布到购物车

Woocommerce根据订单状态重定向到自定义页面

在Woocommerce管理员“编辑订单”页面中显示客户取消的订单数

WooCommerce 订单接收页面上的自定义交付范围错误数据

在woocommerce订单页面定制用户的元数据显示自定义列

在WooCommerce的电子邮件和订单页面中保存并显示产品自定义数据

如何将自定义变量从 ResetPasswordController 传递到重置刀片