在 Woocommerce 3 中的结帐和我的帐户上启用自定义字段
Enable a Custom Field on checkout and on My account In Woocommerce 3
我在结帐页面为 Woocommerce 创建了一些自定义字段。我能够在 WP 管理区域、电子邮件和发票中显示它们,但不能在用户仪表板的前端显示。
这是我用来在 function.php
文件的 CHILD-THEM 中创建字段 "CODICE SNEP" 的代码:
// Create hook - CODICE SNEP
add_filter( 'woocommerce_checkout_fields' , 'codice_snep' );
function codice_snep ( $fields ) {
$fields['billing']['codice_snep'] = array(
'label' => __('Codice Snep', 'woocommerce'),
'placeholder' => _x('Codice Snep', 'placeholder', 'woocommerce'),
'required' => true,
'clear' => true
);
return $fields;
}
add_action( 'woocommerce_checkout_update_order_meta', 'codice_snep_order_meta' );
function codice_snep_order_meta( $order_id ) {
if ( ! empty( $_POST['codice_snep'] ) ) {
update_post_meta( $order_id, 'Codice Snep', sanitize_text_field( $_POST['codice_snep'] ) );
}
}
// Save the custom field 'codice_snep'
add_action( 'woocommerce_save_account_details', 'save_codice_snep_account_details', 12, 1 );
function save_codice_snep_account_details( $user_id ) {
// For Codice Snep
if( isset( $_POST['codice_snep'] ) )
update_user_meta( $user_id, 'codice_snep', sanitize_text_field( $_POST['codice_snep'] ) );
}
之后,如果您不输入该字段,我会显示错误:
// Show error if you don't insert CODICE SNEP
add_action('woocommerce_checkout_process', 'required_codice_snep_checkout_field_process');
function required_codice_snep_checkout_field_process() {
// Check if set, if its not set add an error.
if ( ! $_POST['codice_snep'] )
wc_add_notice( __( 'Compila il campo Codice SNEP .' ), 'error' );
}
然后我在 WC 的管理区、电子邮件和发票中显示代码:
// Show field codice snep in the Wc pdf invoices plugin
add_action( 'wpo_wcpdf_after_order_data', 'wpo_wcpdf_codice_snep', 10, 2 );
function wpo_wcpdf_codice_snep ($template_type, $order) {
$document = wcpdf_get_document( $template_type, $order );
if ($template_type == 'invoice') {
?>
<tr>
<th>Codice Snep:</th>
<td><?php $document->custom_field('Codice Snep'); ?></td>
</tr>
<?php
}
}
// Show CODICE SNEP in Back End Wp
add_action( 'woocommerce_admin_order_data_after_billing_address', 'codice_snep_order_meta_admin', 10, 1 );
function codice_snep_order_meta_admin($order){
echo '<p><strong>'.__('Codice Snep').':</strong> ' . get_post_meta( $order->id, 'Codice Snep', true ) . '</p>';
}
// Show codoce snep in the order email
add_filter('woocommerce_email_order_meta_keys', 'my_custom_codice_snep_order_meta_keys');
function my_custom_codice_snep_order_meta_keys( $keys ) {
$keys[] = 'Codice Snep';
return $keys;
}
到这里一切似乎都正常。
现在的问题是在仪表板前端只显示(必须不可编辑)这个字段(codice_snep
)。
现在我正在尝试这个,但我只能看到没有字段值的标签。
// Show codice snep in the Dashboard of the user in front-end.
add_action( 'woocommerce_account_dashboard', 'codice_snep_order_dashboard', 12, 1 );
function codice_snep_order_dashboard ($order){
echo '<p><strong>'.__('Codice Snep').':</strong> ' . get_post_meta( $order->id, 'Codice Snep', true ) . '</p>';
}
事情是这样的:Field not showing on dashboard
你能帮我解决这个问题以显示用户在结帐时插入的 value
吗?
您使用的代码有点过时and/or一些挂钩已弃用(即使它们来自 Woocommerce 文档)。
下面的代码使用了不同的钩子。它允许在结帐和我的帐户 > 地址 > 账单字段中显示此字段和相关数据(如果存在),而无需额外的验证码。
另外,在下订单时,数据会同时保存在订单和用户元数据中。因此代码更紧凑,并使用了 Woocommerce 3.
中引入的正确钩子 with the new CRUD methods
您重访的代码:
// Display a custom field on checkout and on My account > edit billing address
add_filter( 'woocommerce_billing_fields' , 'adding_billing_codice_snep', 20, 1 );
function adding_billing_codice_snep ( $fields ) {
$fields['billing_codice_snep'] = array(
'label' => __('Codice Snep', 'woocommerce'),
'placeholder' => _x('Codice Snep', 'placeholder', 'woocommerce'),
'class' => array('form-row-wide'),
'required' => true,
'clear' => true,
);
return $fields;
}
// Save the custom field data to the order meta data and to user meta data
add_action( 'woocommerce_checkout_create_order', 'codice_snep_order_meta', 20, 2 );
function codice_snep_order_meta( $order, $data ) {
if ( isset( $_POST['billing_codice_snep'] ) && ! empty( $_POST['billing_codice_snep'] ) ) {
$order->update_meta_data('_billing_codice_snep', sanitize_text_field( $_POST['billing_codice_snep'] ) );
update_user_meta( $order->get_customer_id(), 'billing_codice_snep', sanitize_text_field( $_POST['billing_codice_snep'] ) );
}
}
// Order pages (frontend and admin): Display custom field "codice snep"
add_filter( 'woocommerce_order_details_after_order_table' , 'display_admin_order_meta_codice_snep', 20, 1 ); // Front
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_admin_order_meta_codice_snep', 20, 1 ); // Admin
function display_admin_order_meta_codice_snep( $order ){
$codice_snep = $order->get_meta('_billing_codice_snep', true );
if( ! empty( $codice_snep ) ){
$label = __('Codice Snep');
if( is_admin() ){ // Admin
echo '<p><strong>' . $label . ':</strong> ' . $codice_snep . '</p>';
}
else { // Front end: order view and Order received (thankyou)
echo '<table class="woocommerce-table"><tbody><tr>
<th>' . $label . ':</th><td>' . $codice_snep . '</td>
</tr></tbody></table>';
}
}
}
// Email notifications: Display custom field "codice snep"
add_filter( 'woocommerce_email_order_meta_fields' , 'display_email_codice_snep', 20, 3 );
function display_email_codice_snep ( $fields, $sent_to_admin, $order ) {
$codice_snep = $order->get_meta('_billing_codice_snep', true );
if( ! empty( $codice_snep ) )
$fields['codice_snep'] = array(
'label' => __("Codice Snep"),
'value' => $codice_snep,
);
return $fields;
}
// PDF Invoices: Display custom field "codice snep"
add_action( 'wpo_wcpdf_after_order_data', 'display_pdf_invoice_codice_snep', 20, 2 );
function display_pdf_invoice_codice_snep ($template_type, $order) {
$document = wcpdf_get_document( $template_type, $order );
if ($template_type == 'invoice') {
echo '<tr>
<th>' . __("Codice Snep") . ':</th>
<td>' . $order->get_meta('_billing_codice_snep', true ) . '</td>
</tr>';
}
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
订单视图:
我的账户 > 地址 > 结算
我在结帐页面为 Woocommerce 创建了一些自定义字段。我能够在 WP 管理区域、电子邮件和发票中显示它们,但不能在用户仪表板的前端显示。
这是我用来在 function.php
文件的 CHILD-THEM 中创建字段 "CODICE SNEP" 的代码:
// Create hook - CODICE SNEP
add_filter( 'woocommerce_checkout_fields' , 'codice_snep' );
function codice_snep ( $fields ) {
$fields['billing']['codice_snep'] = array(
'label' => __('Codice Snep', 'woocommerce'),
'placeholder' => _x('Codice Snep', 'placeholder', 'woocommerce'),
'required' => true,
'clear' => true
);
return $fields;
}
add_action( 'woocommerce_checkout_update_order_meta', 'codice_snep_order_meta' );
function codice_snep_order_meta( $order_id ) {
if ( ! empty( $_POST['codice_snep'] ) ) {
update_post_meta( $order_id, 'Codice Snep', sanitize_text_field( $_POST['codice_snep'] ) );
}
}
// Save the custom field 'codice_snep'
add_action( 'woocommerce_save_account_details', 'save_codice_snep_account_details', 12, 1 );
function save_codice_snep_account_details( $user_id ) {
// For Codice Snep
if( isset( $_POST['codice_snep'] ) )
update_user_meta( $user_id, 'codice_snep', sanitize_text_field( $_POST['codice_snep'] ) );
}
之后,如果您不输入该字段,我会显示错误:
// Show error if you don't insert CODICE SNEP
add_action('woocommerce_checkout_process', 'required_codice_snep_checkout_field_process');
function required_codice_snep_checkout_field_process() {
// Check if set, if its not set add an error.
if ( ! $_POST['codice_snep'] )
wc_add_notice( __( 'Compila il campo Codice SNEP .' ), 'error' );
}
然后我在 WC 的管理区、电子邮件和发票中显示代码:
// Show field codice snep in the Wc pdf invoices plugin
add_action( 'wpo_wcpdf_after_order_data', 'wpo_wcpdf_codice_snep', 10, 2 );
function wpo_wcpdf_codice_snep ($template_type, $order) {
$document = wcpdf_get_document( $template_type, $order );
if ($template_type == 'invoice') {
?>
<tr>
<th>Codice Snep:</th>
<td><?php $document->custom_field('Codice Snep'); ?></td>
</tr>
<?php
}
}
// Show CODICE SNEP in Back End Wp
add_action( 'woocommerce_admin_order_data_after_billing_address', 'codice_snep_order_meta_admin', 10, 1 );
function codice_snep_order_meta_admin($order){
echo '<p><strong>'.__('Codice Snep').':</strong> ' . get_post_meta( $order->id, 'Codice Snep', true ) . '</p>';
}
// Show codoce snep in the order email
add_filter('woocommerce_email_order_meta_keys', 'my_custom_codice_snep_order_meta_keys');
function my_custom_codice_snep_order_meta_keys( $keys ) {
$keys[] = 'Codice Snep';
return $keys;
}
到这里一切似乎都正常。
现在的问题是在仪表板前端只显示(必须不可编辑)这个字段(codice_snep
)。
现在我正在尝试这个,但我只能看到没有字段值的标签。
// Show codice snep in the Dashboard of the user in front-end.
add_action( 'woocommerce_account_dashboard', 'codice_snep_order_dashboard', 12, 1 );
function codice_snep_order_dashboard ($order){
echo '<p><strong>'.__('Codice Snep').':</strong> ' . get_post_meta( $order->id, 'Codice Snep', true ) . '</p>';
}
事情是这样的:Field not showing on dashboard
你能帮我解决这个问题以显示用户在结帐时插入的 value
吗?
您使用的代码有点过时and/or一些挂钩已弃用(即使它们来自 Woocommerce 文档)。
下面的代码使用了不同的钩子。它允许在结帐和我的帐户 > 地址 > 账单字段中显示此字段和相关数据(如果存在),而无需额外的验证码。
另外,在下订单时,数据会同时保存在订单和用户元数据中。因此代码更紧凑,并使用了 Woocommerce 3.
中引入的正确钩子 with the new CRUD methods您重访的代码:
// Display a custom field on checkout and on My account > edit billing address
add_filter( 'woocommerce_billing_fields' , 'adding_billing_codice_snep', 20, 1 );
function adding_billing_codice_snep ( $fields ) {
$fields['billing_codice_snep'] = array(
'label' => __('Codice Snep', 'woocommerce'),
'placeholder' => _x('Codice Snep', 'placeholder', 'woocommerce'),
'class' => array('form-row-wide'),
'required' => true,
'clear' => true,
);
return $fields;
}
// Save the custom field data to the order meta data and to user meta data
add_action( 'woocommerce_checkout_create_order', 'codice_snep_order_meta', 20, 2 );
function codice_snep_order_meta( $order, $data ) {
if ( isset( $_POST['billing_codice_snep'] ) && ! empty( $_POST['billing_codice_snep'] ) ) {
$order->update_meta_data('_billing_codice_snep', sanitize_text_field( $_POST['billing_codice_snep'] ) );
update_user_meta( $order->get_customer_id(), 'billing_codice_snep', sanitize_text_field( $_POST['billing_codice_snep'] ) );
}
}
// Order pages (frontend and admin): Display custom field "codice snep"
add_filter( 'woocommerce_order_details_after_order_table' , 'display_admin_order_meta_codice_snep', 20, 1 ); // Front
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_admin_order_meta_codice_snep', 20, 1 ); // Admin
function display_admin_order_meta_codice_snep( $order ){
$codice_snep = $order->get_meta('_billing_codice_snep', true );
if( ! empty( $codice_snep ) ){
$label = __('Codice Snep');
if( is_admin() ){ // Admin
echo '<p><strong>' . $label . ':</strong> ' . $codice_snep . '</p>';
}
else { // Front end: order view and Order received (thankyou)
echo '<table class="woocommerce-table"><tbody><tr>
<th>' . $label . ':</th><td>' . $codice_snep . '</td>
</tr></tbody></table>';
}
}
}
// Email notifications: Display custom field "codice snep"
add_filter( 'woocommerce_email_order_meta_fields' , 'display_email_codice_snep', 20, 3 );
function display_email_codice_snep ( $fields, $sent_to_admin, $order ) {
$codice_snep = $order->get_meta('_billing_codice_snep', true );
if( ! empty( $codice_snep ) )
$fields['codice_snep'] = array(
'label' => __("Codice Snep"),
'value' => $codice_snep,
);
return $fields;
}
// PDF Invoices: Display custom field "codice snep"
add_action( 'wpo_wcpdf_after_order_data', 'display_pdf_invoice_codice_snep', 20, 2 );
function display_pdf_invoice_codice_snep ($template_type, $order) {
$document = wcpdf_get_document( $template_type, $order );
if ($template_type == 'invoice') {
echo '<tr>
<th>' . __("Codice Snep") . ':</th>
<td>' . $order->get_meta('_billing_codice_snep', true ) . '</td>
</tr>';
}
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
订单视图:
我的账户 > 地址 > 结算