在 Woocommerce 编辑订单页面中显示可编辑的自定义字段值

Mar*_*ner 4 php wordpress checkout orders woocommerce

我不是开发人员,但以某种方式设法将 Woocommerce 自定义字段添加到结帐和订单编辑页面。有类似的问题,但我找不到正确的解决方案。

\n\n

自定义字段在管理订单编辑页面中可见,但不显示值,也不会添加到订单电子邮件中。

\n\n

我缺少什么?

\n\n

请看最后的截图。

\n\n

这是所有代码的组合:

\n\n
// Woocommerce - Add user custom billing fields\n// =============================================================================\n\nfunction add_woocommerce_admin_billing_fields($billing_fields) {\n    $billing_fields[\'billing_birthday\'] = array(\n        \'label\' => __(\'Datum rojstva\', \'woocommerce\')\n    );\n    $billing_fields[\'billing_socialno\'] = array(\n        \'label\' => __(\'Dav\xc4\x8dna \xc5\xa1tevilka\', \'woocommerce\')\n    );\n\n    return $billing_fields;\n}\nadd_filter(\'woocommerce_admin_billing_fields\', \'add_woocommerce_admin_billing_fields\');\n\nfunction add_woocommerce_found_customer_details($customer_data, $user_id, $type_to_load) {\n    if ($type_to_load == \'billing\') {\n        $customer_data[$type_to_load . \'billing_birthday\'] = get_user_meta($user_id, $type_to_load . \'billing_birthday\', true);\n        $customer_data[$type_to_load . \'billing_socialno\'] = get_user_meta($user_id, $type_to_load . \'billing_socialno\', true);\n\n    }\n    return $customer_data;\n}\nadd_filter(\'woocommerce_found_customer_details\', \'add_woocommerce_found_customer_details\', 10, 3);\n\nfunction add_woocommerce_billing_fields($billing_fields) {\n    $billing_fields[\'billing_birthday\'] = array(\n        \'type\' => \'tel\',\n        \'label\' => __(\'Datum rojstva\'),\n        \'value\' => get_post_meta( $order->id, \'billing_birthday\', true ),\n        \'placeholder\' => __(\'dd/mm/yyyy\', \'placeholder\'),\n        \'pattern\' => __(\'\\d{1,2}/\\d{1,2}/\\d{4}\', \'pattern\' ),\n        \'class\' => array(\'form-row-first\'),\n        \'required\' => true,\n        \'clear\' => true\n\n    );\n    $billing_fields[\'billing_socialno\'] = array(\n        \'type\' => \'tel\',\n        \'label\' => __(\'Dav\xc4\x8dna \xc5\xa1tevilka\'),\n        \'value\' => get_post_meta( $order->id, \'billing_socialno\', true ),\n        \'placeholder\' => _x(\'8-mestna \xc5\xa1tevilka\', \'placeholder\'),\n        \'class\' => array(\'form-row-last\'),\n        \'required\' => false,\n        \'clear\' => true\n    );\n\n    return $billing_fields;\n}\nadd_filter(\'woocommerce_billing_fields\', \'add_woocommerce_billing_fields\');\n\n//Doda user meta v backend profil\nfunction add_woocommerce_customer_meta_fields($billing_fields) {\n    if (isset($billing_fields[\'billing\'][\'fields\'])) {\n        $billing_fields[\'billing\'][\'fields\'][\'billing_birthday\'] = array(\n            \'label\' => __(\'Datum rojstva\', \'woocommerce\'),\n            \'description\' => \'Pa kaj bo kon\xc4\x8dno ratalo memo milo?\'\n        );\n        $billing_fields[\'billing\'][\'fields\'][\'billing_socialno\'] = array(\n            \'label\' => __(\'Dav\xc4\x8dna \xc5\xa1tevilka\', \'woocommerce\'),\n            \'description\' => \'\'\n        );\n\n    }\n    return $billing_fields;\n}\nadd_filter(\'woocommerce_customer_meta_fields\', \'add_woocommerce_customer_meta_fields\');\n\nfunction add_woocommerce_order_fields($address, $order) {\n    $address[\'billing_birthday\'] = $order->billing_birthday . get_post_meta($order->id, \'_billing_birthday\', true) ;\n    $address[\'billing_socialno\'] = $order->billing_socialno;\n    return $address;\n}\nadd_filter(\'woocommerce_order_formatted_billing_address\', \'add_woocommerce_order_fields\', 10, 2);\n\nfunction add_woocommerce_formatted_address_replacements($replace, $args) {\n    $replace[\'{billing_birthday}\'] = !empty($args[\'billing_birthday\']) ? \'Datum rojstva\' . $args[\'billing_birthday\'] : \'\';\n    $replace[\'{billing_socialno}\'] = !empty($args[\'billing_socialno\']) ? \'Dav\xc4\x8dna \xc5\xa1tevilka\' . $args[\'billing_socialno\'] : \'\';\n    return $replace;\n}\nadd_filter(\'woocommerce_formatted_address_replacements\', \'add_woocommerce_formatted_address_replacements\', 10, 2);\n\nfunction add_woocommerce_localisation_address_formats($formats) {\n    $formats[\'default\'] = $formats[\'default\'] . "\\n{billing_birthday}\\n{billing_socialno}";\n    return $formats;\n}\nadd_filter(\'woocommerce_localisation_address_formats\', \'add_woocommerce_localisation_address_formats\', 10, 1);\n\n// Change field type to tel woocommerce checkout\n\nfunction bbloomer_change_checkout_field_input_type() {\necho "<script>document.getElementById(\'billing_postcode\').type = \'tel\';</script>";\necho "<script>document.getElementById(\'billing_birthday\').type = \'tel\';</script>";\n\n}\n\nadd_action( \'woocommerce_after_checkout_form\', \'bbloomer_change_checkout_field_input_type\'); \n
Run Code Online (Sandbox Code Playgroud)\n\n

订单编辑页面截图

\n\n

在此输入图像描述

\n

Loi*_*tec 5

我测试了你的代码,只有一些小错误。您已经非常接近让它按您的预期工作了。所以你应该需要对以下代码进行一些更改:

\n\n

1)删除了“值”,因为这个挂钩函数适用于结帐并且不需要值(当您尝试从不存在的订单中获取它们时更不需要值)。

\n\n
\n

这将避免隐藏错误,并在客户已填写先前购买\xe2\x80\xa6 中的字段时显示正确的值

\n
\n\n
// Add custom Checkout billing fields\nadd_filter(\'woocommerce_billing_fields\', \'add_woocommerce_billing_fields\', 20, 1);\nfunction add_woocommerce_billing_fields( $billing_fields ) {\n\n    $billing_fields[\'billing_birthday\'] = array(\n        \'type\' => \'tel\',\n        \'label\' => __(\'Datum rojstva\'),\n        \'placeholder\' => __(\'dd/mm/yyyy\', \'placeholder\'),\n        \'pattern\' => __(\'\\d{1,2}/\\d{1,2}/\\d{4}\', \'pattern\' ),\n        \'class\' => array(\'form-row-first\'),\n        \'required\' => true,\n        \'clear\' => true\n    );\n\n    $billing_fields[\'billing_socialno\'] = array(\n        \'type\' => \'tel\',\n        \'label\' => __(\'Dav\xc4\x8dna \xc5\xa1tevilka\'),\n        \'placeholder\' => _x(\'8-mestna \xc5\xa1tevilka\', \'placeholder\'),\n        \'class\' => array(\'form-row-last\'),\n        \'required\' => false,\n        \'clear\' => true\n    );\n\n    return $billing_fields;\n}\n\n// Change field type to tel for woocommerce checkout\nadd_action( \'woocommerce_after_checkout_form\', \'change_checkout_field_input_type\');\nfunction change_checkout_field_input_type() {\n    echo "<script>document.getElementById(\'billing_postcode\').type = \'tel\';</script>";\n    echo "<script>document.getElementById(\'billing_birthday\').type = \'tel\';</script>";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

2) 此处的键错误,这就是字段值未显示在管理订单编辑页面中的原因。

\n\n
\n

它是\'birthday\'and\'socialno\'而不是\'billing_birthday\'and \'billing_socialno\'

\n
\n\n
// Setting custom fields Keys/Labels pairs in admin edit order pages and allow edit this fields correctly.\nadd_filter(\'woocommerce_admin_billing_fields\', \'add_woocommerce_admin_billing_fields\');\nfunction add_woocommerce_admin_billing_fields($billing_fields) {\n    $billing_fields[\'birthday\'] = array( \'label\' => __(\'Datum rojstva\', \'woocommerce\') );\n    $billing_fields[\'socialno\'] = array( \'label\' => __(\'Dav\xc4\x8dna \xc5\xa1tevilka\', \'woocommerce\') );\n\n    return $billing_fields;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

3) 正确获取订单编辑页面中显示的缺失字段值。

\n\n
// Get the field values to be displayed in admin Order edit pages\nadd_filter(\'woocommerce_order_formatted_billing_address\', \'add_woocommerce_order_fields\', 10, 2);\nfunction add_woocommerce_order_fields($address, $order ) {\n    $address[\'billing_birthday\'] = get_post_meta( $order->get_id(), \'_billing_birthday\', true );\n    $address[\'billing_socialno\'] = get_post_meta( $order->get_id(), \'_billing_socialno\', true );\n    return $address;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

4)其他未更改的挂钩函数:

\n\n
//Doda user meta v backend profil\nadd_filter(\'woocommerce_customer_meta_fields\', \'add_woocommerce_customer_meta_fields\');\nfunction add_woocommerce_customer_meta_fields($fields) {\n    if (isset($fields[\'billing\'][\'fields\'])) {\n        $fields[\'billing\'][\'billing_birthday\'] = array(\n            \'label\' => __(\'Datum rojstva\', \'woocommerce\'),\n            \'description\' => \'Pa kaj bo kon\xc4\x8dno ratalo memo milo?\'\n        );\n        $fields[\'billing\'][\'billing_socialno\'] = array(\n            \'label\' => __(\'Dav\xc4\x8dna \xc5\xa1tevilka\', \'woocommerce\'),\n            \'description\' => \'\'\n        );\n    }\n    return $fields;\n}\n\nadd_filter( \'woocommerce_found_customer_details\', \'add_woocommerce_found_customer_details\', 10, 3);\nfunction add_woocommerce_found_customer_details($customer_data, $user_id, $type_to_load) {\n    if ($type_to_load == \'billing\') {\n        $customer_data[$type_to_load . \'billing_birthday\'] = get_user_meta($user_id, $type_to_load . \'billing_birthday\', true);\n        $customer_data[$type_to_load . \'billing_socialno\'] = get_user_meta($user_id, $type_to_load . \'billing_socialno\', true);\n\n    }\n    return $customer_data;\n}\n\n//add_filter(\'woocommerce_formatted_address_replacements\', \'add_woocommerce_formatted_address_replacements\', 10, 2);\nfunction add_woocommerce_formatted_address_replacements($replace, $args) {\n    $replace[\'{billing_birthday}\'] = !empty($args[\'billing_birthday\']) ? \'Datum rojstva\' . $args[\'billing_birthday\'] : \'\';\n    $replace[\'{billing_socialno}\'] = !empty($args[\'billing_socialno\']) ? \'Dav\xc4\x8dna \xc5\xa1tevilka\' . $args[\'billing_socialno\'] : \'\';\n    return $replace;\n}\n\nadd_filter(\'woocommerce_localisation_address_formats\', \'add_woocommerce_localisation_address_formats\', 10, 1);\nfunction add_woocommerce_localisation_address_formats($formats) {\n    $formats[\'default\'] = $formats[\'default\'] . "\\n{billing_birthday}\\n{billing_socialno}";\n    return $formats;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

代码位于活动子主题(或活动主题)的 function.php 文件中。

\n\n
\n\n

电子邮件通知- 显示自定义字段(及其标签)。

\n\n

emails/email-addresses.php通过您的活动子主题覆盖 Woocommerce 模板:

\n\n
\n

可以通过从以下位置复制来覆盖此模板:
plugin/woocommerce/templates/emails/email-addresses.php
\n 到yourtheme/woocommerce/emails/email-addresses.php\xe2\x80\xa6
\n 官方文档:模板结构和通过主题覆盖模板

\n
\n\n

您将在第 34 行之后 (就在计费电话之后)插入以下内容:

\n\n
<?php\n    // Billing birthday\n    $billing_birthday = get_post_meta($order->get_id(), \'_billing_birthday\', true );\n    echo $billing_birthday ? \'<br/>\'.__(\'Datum rojstva\', \'woocommerce\').\': \'.$billing_birthday : \'\';\n\n    // Billing socialno\n    $billing_socialno = get_post_meta($order->get_id(), \'_billing_socialno\', true );\n    echo $billing_socialno ? \'<br/>\'.__(\'Dav\xc4\x8dna \xc5\xa1tevilka\', \'woocommerce\').\': \'.$billing_socialno : \'\';\n?>\n
Run Code Online (Sandbox Code Playgroud)\n\n

经过测试并有效。

\n