Woocommerce:设置结帐字段值

Posted

技术标签:

【中文标题】Woocommerce:设置结帐字段值【英文标题】:Woocommerce: Set checkout field values 【发布时间】:2018-01-18 01:36:21 【问题描述】:

对于在我的系统中还不是 WP 用户的特殊客户群,我将他们引导至一个特殊页面,他们将在其中从一组有限的产品中进行选择。我已经拥有了他们的所有信息,并且我将在此登录页面上预先填充。当他们验证了他们的信息后,它会将他们的产品添加到购物车并直接跳到结账处。到目前为止,我已经掌握了所有这些。

我想要做的是使用我拥有的客户姓名和账单信息预先填充结帐数据,但我不完全确定该怎么做。但这是我到目前为止所得到的:

    function onboarding_update_fields( $fields = array() ) 

      $token = ( ! empty( $_GET['token'] ) ) ? $_GET['token'] : '';   
      if( 'testtoken' == $token )           
        $fields['billing']['billing_first_name']['value'] = 'Joe';
        var_dump( $fields ); 
        
      return $fields;
     

    add_filter( 'woocommerce_checkout_fields', 'onboarding_update_fields' );

如何更改结帐字段的值?上面的代码没有这样做。在其中一个上给我指明正确的方向,剩下的事情我可以做。

我查看了here,但也没有找到我要找的东西。

谢谢!

【问题讨论】:

您必须在函数末尾添加return $fields; 愚蠢的我把它忽略了,但是它带回了其他字段,但它仍然没有改变值。 我有另一个有趣的选择,你可以试试,因为这是一个特定的钩子,用于预填充结帐字段...... 【参考方案1】:

过滤器允许您修改信息,但您必须从您的函数中返回该信息。

因此,在这种情况下,您只是在函数中缺少return $fields;

function onboarding_update_fields( $fields = array() ) 
   // check if it's set to prevent notices being thrown
   $token = ( ! empty( $_GET['token'] ) ) ? $_GET['token'] : '';

   // yoda-style to prevent accidental assignment
   if( 'testtoken' == $token ) 
       // if you are having issues, it's useful to do this below:
       var_dump( $fields );
       // remove the var_dump once you've got things working

       // if all you want to change is the value, then assign ONLY the value
       $fields['billing']['billing_first_name']['value'] = 'Joe';
       // the way you were doing it before was removing core / required parts of the array - do not do it this way.
       // $fields['billing']['billing_first_name']['value'] = array( 'value' => 'Joe');

   
   // you must return the fields array 
   return $fields;


add_filter( 'woocommerce_checkout_fields', 'onboarding_update_fields' );

更新: 在看到由于某种原因上面不起作用之后,我在另一个插件上嗅探了一些代码,他们这样做的方式(并且它显然有效)是这样的:

function onboarding_update_fields( $fields = array() ) 
   $token = ( ! empty( $_GET['token'] ) ) ? $_GET['token'] : '';

   if( 'testtoken' == $token ) 
       // Assign the value to the $_POST superglobal
       $_POST['billing_first_name'] = 'Joe';
   

   return $fields;

所以 - 肯定这不会覆盖/踩踏用户输入的信息,我可能会建议考虑这样做(当然要测试以确保它有效):

function onboarding_update_fields( $fields = array() ) 
   $token = ( ! empty( $_GET['token'] ) ) ? $_GET['token'] : '';

   if( 'testtoken' == $token ) 
       // Assign the value to the $_POST superglobal ONLY if not already set
       if ( empty( $POST['billing_first_name'] ) ) 
           $_POST['billing_first_name'] = 'Joe';
       
   

   return $fields;

【讨论】:

不,billing_first_name 字段没有被更改。 对不起,我的意思是“不工作”字段值没有改变。但是添加return 解决了字段消失的问题。 在您的if 之外添加一个var_dump。我猜你的if 没有触发。 是的,var_dump 出现了。匆忙中,我重新输入了错误的“testtoken”。这是 var_dump 的相关部分:` ["billing_first_name"]=> array(4) ["label"]=> string(10) "First Name" ["required"]=> bool(true) `如您所见, billing_first_name 的值仍然为空。 为了确保没有遗漏任何内容,我在 var 转储中搜索了“Joe”,但没有找到。【参考方案2】:

您应该使用这个专用的 WooCommerce 挂钩,用于预填充结帐字段并在 WC_Checkout 方法 get_value() 中定义:

add_filter( 'woocommerce_checkout_get_value', 'populating_checkout_fields', 10, 2 );
function populating_checkout_fields ( $value, $input ) 
    
    $token = ( ! empty( $_GET['token'] ) ) ? $_GET['token'] : '';
    
    if( 'testtoken' == $token ) 
        // Define your checkout fields  values below in this array (keep the ones you need)
        $checkout_fields = array(
            'billing_first_name'    => 'John',
            'billing_last_name'     => 'Wick',
            'billing_company'       => 'Murders & co',
            'billing_country'       => 'US',
            'billing_address_1'     => '7 Random street',
            'billing_address_2'     => 'Royal suite',
            'billing_city'          => 'Los Angeles',
            'billing_state'         => 'CA',
            'billing_postcode'      => '90102',
            'billing_phone'         => '555 702 666',
            'billing_email'         => 'jhon.wick@murders.com',
            'shipping_first_name'   => 'John',
            'shipping_last_name'    => 'Wick',
            'shipping_company'      => 'Murders & co',
            'shipping_country'      => 'USA',
            'shipping_address_1'    => '7 Random street',
            'shipping_address_2'    => 'Royal suite',
            'shipping_city'         => 'Los Angeles',
            'shipping_state'        => 'California',
            'shipping_postcode'     => '90102',
            // 'account_password'       => '',
            'order_comments'        => 'This is not for me',
        );
        foreach( $checkout_fields as $key_field => $field_value )
            if( $input == $key_field && ! empty( $field_value ) )
                $value = $field_value;
            
        
    
    return $value;

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

如果用户没有登录,你可以在你的条件中额外添加:

 if( 'testtoken' == $token &&  ! is_user_logged_in() ) 

此代码已经过测试并且可以工作(但未根据您的特定代码条件进行测试)。对于我的测试,我使用! is_user_logged_in() 作为条件。

你会得到这个(对于函数中定义的数组):

【讨论】:

这似乎是更清洁的方法。我稍后会测试一下。谢谢! 好的,谢谢。 "cale_b" 的代码确实是一个很好的 PHP 转身,但是 woocommerce_checkout_get_value 是 WooCommerce 专用的钩子来使它... 我查看了此处的文档,并没有说明更改值的任何内容。在这方面,文档似乎有点缺乏。 docs.woocommerce.com/document/… @Difster 但是 WC_Checkout get_value 方法中的钩子是为此而生的,因为它非常明确......现在您需要对其进行测试,看看什么对您来说更方便。这个答案只是另一种方式,带有 woocommerce 专用钩子和特定参数。【参考方案3】:

请使用“默认”,例如:

$fields['billing']['billing_first_name']['default'] = "Thomas";

参考WooCommerce | Set billing field value

【讨论】:

这对我来说是正确的答案。使用['default'] 使其工作。 这是最好的答案,谢谢@Frank Liu

以上是关于Woocommerce:设置结帐字段值的主要内容,如果未能解决你的问题,请参考以下文章

删除 WooCommerce 结帐字段值

根据 WooCommerce 结帐字段值显示/隐藏运输方式

根据 WooCommerce 结帐字段值显示/隐藏运输方式

在 Woocommerce 3+ 中自定义一些结帐字段属性

如何在自定义 woocommerce 结帐字段中显示 $_SESSION 变量?

在 Woocommerce 的管理订单详细信息部分显示自定义结帐字段值