【问题标题】:Pass custom posted variable from a page to Woocommerce order data将自定义发布的变量从页面传递到 Woocommerce 订单数据
【发布时间】:2021-02-25 10:01:20
【问题描述】:

我可以使用这样的代码向 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>

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

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

我会为按钮使用什么代码 - 点击时会将表单值发布到我的订单中,然后直接到另一个页面?

【问题讨论】:

  • 嗨@jon,我用我的单个产品页面测试了代码,但它也重定向到了结帐页面。我猜你使用了自定义主题或插件,它改变了产品页面的默认行为。您可以检查代码并将相同的代码应用于其他页面。
  • 代码不是完整代码,而是提取的代码示例,可以在产品页面上运行。但是,我正在我的自定义页面上尝试此代码 - 而不是产品页面。我在此代码在我的自定义页面上的问题中解释了页面流程。目标是结帐并更新/添加自定义订单详细信息。 action="" 将定向到 chekout。我不清楚你在问什么。
  • 在其他页面上,您是否使用 GET url 添加到购物车? Ajax 帖子添加到购物车?邮寄表格?其中很多?
  • @MichaelHabib 该代码似乎没有做任何事情,不清楚该代码会出现在哪个页面上,或者哪个按钮代码会触发任何更新?

标签: php wordpress forms session woocommerce


【解决方案1】:

下面是一种在结帐页面和其他任何地方获取已发布数据的方法,而不会丢失此已发布数据。为此,我们将发布的数据设置为 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 中获取该数据:

$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 thankyou_display_dog_data( $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 版本上测试并运行。

【讨论】:

  • 那是相当不错的东西 - 但如果我包含功能 - action_checkout_add_custom_order_meta,我会收到“内部服务器错误”按“下订单”按钮。创建元数据可以代替购物车,但我必须将它连接到购物车数据显示的任何地方 - 订单详细信息/管理员/电子邮件等。我还看到你发表了一篇关于根据输入更改购物车价格的帖子 - 我猜那会在这里工作。谢谢
  • @Jon 对不起,我的错,最后一个挂钩函数有一点疏忽,我现在已经更新了。一切都很好。再试一次……
  • 是的,现在完成订单,谢谢。我需要使用所有的钩子来检查数据是否被钩住。很好的答案 - 谢谢
  • 所以我在挂钩数据时遇到问题。我可以让 $values 在订单中显示,但是在“下订单”之后它显示为 null 并且 $order 给出了 Uncaught Error: Call to a member function get_meta() 。所以我不清楚在哪里使用哪个。我正在使用的函数会生成此错误: add_action( 'woocommerce_thankyou', 'dog' );函数狗(){$order = wc_get_order($order_id); $dogname = $order->get_meta('_dogname');回声$狗名; }
  • @Jon 问题出在您的代码中,您错过了在function dog( $order_id ) { 中添加$order_id 作为函数参数......我在答案末尾添加了一个相关的添加。它现在应该可以工作了。
【解决方案2】:

使用他的thankyou_display_dog_data 函数为 LoicTheAztec 答案添加更多功能。他包含的操作显示了结帐后感谢您的功能

add_action( 'woocommerce_admin_order_data_after_shipping_address', 'thankyou_display_dog_data' );  //add  to admin order data under shipping
add_action( 'woocommerce_admin_order_data_after_billing_address', 'thankyou_display_dog_data' );  //add  to admin under billing - pick one or duplicate of shipping
add_action( 'woocommerce_order_details_after_order_table', 'thankyou_display_dog_data' );  //add to frontend customers my account  
add_action( 'woocommerce_email_after_order_table', 'thankyou_display_dog_data', 15, 2 );  // add to emails

【讨论】:

    猜你喜欢
    • 2020-08-26
    • 2014-04-08
    • 1970-01-01
    • 2016-10-12
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多