Contact Form 7 + WooCommerce - 在订单中保存表单数据
Contact Form 7 + WooCommerce - Save form data in orders
我有以下问题:orders page
我有一个 Contact Form 7,其中有 2 个用于订购活动门票的下拉选项,无需用户注册。这工作正常,但它不会像包含的图像那样在 woocommerce 的 "orders" 页面中保存任何表单数据,这使得跟踪订单变得困难。在联系表的其他设置中,我有以下内容:
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,但我也需要客户数据,如姓名地址和电子邮件。不幸的是,我对这种类型的代码效率不高,有人能告诉我正确的方向吗?
提前致谢!
首先,您可以将 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 会话 class 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');
然后显示数据:
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 />';
}
}
}
我有以下问题:orders page
我有一个 Contact Form 7,其中有 2 个用于订购活动门票的下拉选项,无需用户注册。这工作正常,但它不会像包含的图像那样在 woocommerce 的 "orders" 页面中保存任何表单数据,这使得跟踪订单变得困难。在联系表的其他设置中,我有以下内容:
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,但我也需要客户数据,如姓名地址和电子邮件。不幸的是,我对这种类型的代码效率不高,有人能告诉我正确的方向吗?
提前致谢!
首先,您可以将 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 会话 class 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');
然后显示数据:
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 />';
}
}
}