对于在我的系统中尚未成为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;:

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;
}

关于php - Woocommerce:设置结帐字段值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45602936/

10-16 03:36