联系表格7 + WooCommerce - 按订单

时间:2016-11-15 13:23:07

标签: wordpress woocommerce contact-form-7

我遇到以下问题:orders page

我有一个联系表格7,有2个下拉选项,用于订购活动门票,无需用户注册。这样可以正常工作,但它不会像包含图像那样在woocommerce的“订单”页面中保存任何表单数据,这使得难以跟踪订单。在联系表单的其他设置中,我有以下内容:

on_sent_ok: "switch(document.forms[0].elements["registration_type"].value){case "Normal Registration": location.replace('url/checkout-3/?clear-cart&add-to-cart=325&quantity=1');break;case "Presenter Registration": location.replace('url/checkout-3/?clear-cart&add-to-cart=327&quantity=1');break;};"

将订单插入Woocommerce,但我需要客户数据,如姓名地址和电子邮件。不幸的是,我对这种类型的代码效率不高,任何人都可以让我朝着正确的方向前进吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

首先,您可以将CF7数据保存在会话中,以便以后随订单保存(考虑到此时尚未创建订单)。您可以使用发送邮件时触发的wpcf7_mail_sent操作。 请注意,以下所有代码均在您的主题functions.php。

中进行
function wc_wpcf7_mail_sent_function($contact_form) {
    $submission = WPCF7_Submission::get_instance();
    if($submission) {
        $posted_data = $submission->get_posted_data();
        WC()->session->set('cf7_posted_data', $posted_data);
    }
}
add_action('wpcf7_mail_sent', 'wc_wpcf7_mail_sent_function'); 

这使用Woocommerce Session类WC_Session

然后在处理订单时将数据保存在自定义字段中:

function wc_save_cf7_data_to_order($order_id) {
    $posted_data = base64_encode(serialize(WC()->session->get('cf7_posted_data')));
    if(!empty($posted_data)) {
        add_post_meta($order_id, 'cf7_posted_data', $posted_data);
        WC()->session->__unset('cf7_posted_data');
    }
}
add_action('woocommerce_checkout_order_processed', 'wc_save_cf7_data_to_order', 10, 1);

这会将所有CF7表单数据保存在序列化字符串中,存储在base64中以避免任何解码问题。

最后,您需要添加meta box以在订单页面上显示表单数据:

function wc_add_meta_box() {
    add_meta_box(
        'order_tickets',
        __('Contact form data', 'your-theme'),
        'wc_print_order_cf7_data_callback'),
        'shop_order'
    );
}
add_action('add_meta_boxes', 'wc_add_meta_box');

然后显示数据:

public function print_order_tickets_callback($post) {
    $posted_data = get_post_meta($post->ID, 'cf7_posted_data', true);
    if(!empty($tickets)) {
        $posted_data = unserialiaze(base64_decode($posted_data));
        foreach($posted_data as $key => $data) {
            echo '<b>', $key, ' : </b> ', $data, '<br />';
        }
    }
}