php - 使用保存在 session 中的 Url 变量预填充 Woocommerce 结帐字段

标签 php wordpress woocommerce get checkout

当人们通过电子邮件和姓名作为参数的销售电子邮件中的链接进入我的 woocommerce 商店时,我想在结帐页面中预先填写姓名和电子邮件。

因此我创建了一个 Action 和过滤器。这可以按预期工作,但前提是我在销售页面上进行硬刷新 (ctrl + f5)

我已经从缓存和清漆缓存中排除了销售页面和结帐页面,但这并没有解决问题。

我在这里遗漏了什么吗?你知道为什么这只适用于硬刷新吗?

非常感谢任何帮助。

代码:

    function save()
    {
    if ( is_page( 'sales-page' ) )
    {
        if ( isset( $_GET['tu_em'] ) ) {
            global $woocommerce;
            $woocommerce->session->set( 'tu_em', $_GET['tu_em'] );
        }
        if ( isset( $_GET['tu_name'] ) ) {
            global $woocommerce;
            $woocommerce->session->set( 'tu_name', $_GET['tu_name'] );
        }
    }
}
add_action( 'wp_enqueue_scripts', 'save_email' , 1100);

function override_checkout_email_field( $fields ) {
    global $woocommerce;
    $email = $woocommerce->session->get('tu_em');
    if(!is_null($email)) {
      $fields['billing']['billing_email']['default'] = $email;
    }
    $name = $woocommerce->session->get('tu_name');
    if(!is_null($name)) {
      $fields['billing']['billing_first_name']['default'] = $name;
    }
    return $fields;
}
add_filter( 'woocommerce_checkout_fields' , 'override_checkout_email_field' );

最佳答案

在下面,您将找到正确的工作代码,将来自 URL (GET) 的用户数据保存到 WooCommerce session 中,并使用该数据自动填充相关的结帐字段。

URL 将类似于:http://example.com/sales-page/?tu_em=name@example.com&tu_name=theFirstName

这可以从任何 URL 完成,因为代码会在设置 URL 变量时检测它们。

代码;

// Save user data from URL to Woocommerce session
add_action( 'template_redirect', 'set_custom_data_wc_session' );
function set_custom_data_wc_session () {
    if ( isset( $_GET['tu_em'] ) || isset( $_GET['tu_name'] ) ) {
        $em   = isset( $_GET['tu_em'] )   ? esc_attr( $_GET['tu_em'] )   : '';
        $name = isset( $_GET['tu_name'] ) ? esc_attr( $_GET['tu_name'] ) : '';

        // Set the session data
        WC()->session->set( 'custom_data', array( 'email' => $em, 'name' => $name ) );
    }
}

// Autofill checkout fields from user data saved in Woocommerce session
add_filter( 'woocommerce_billing_fields' , 'prefill_billing_fields' );
function prefill_billing_fields ( $address_fields ) {
    // Get the session data
    $data = WC()->session->get('custom_data');

    // Email
    if( isset($data['email']) && ! empty($data['email']) )
        $address_fields['billing_email']['default'] = $data['email'];

    // Name
    if( isset($data['name']) && ! empty($data['name']) )
        $address_fields['billing_first_name']['default'] = $data['name'];

    return $address_fields;
}

代码在您的事件子主题(或事件主题)的 function.php 文件中。经过测试并有效。

关于php - 使用保存在 session 中的 Url 变量预填充 Woocommerce 结帐字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50356459/

相关文章:

php - Dream Weaver 表宽度

php - 当按月和年对 MYSQL 查询进行分组时,如何按月而不是按字母顺序对数据进行排序?用 PHP 编写

mysql - SQL 查询替换并选择特定 DIV 之间的所有内容

php - 迷你卡中的自定​​义价格值仅在单个产品站点上是错误的

php - 付款过程完成后更新 woocommerce 订单状态并重定向到商店

PHP Mysqli Query 从表数据查询执行

php - ssh2_auth_pubkey_file 认证总是失败

wordpress - 有没有一种简单的方法可以将多个 HTML 页面添加到我的 WordPress 网站?

php - Woocommerce - 禁用变体选择时的图像更改

woocommerce - 仅将 Woocommerce Checkout 用于报价