如何循环访问 WooCommerce 管理订单编辑页面中的多个自定义字段
How to loop though a number of custom fields in WooCommerce admin order edit pages
我有一个根据产品 ID 创建的 WooCommerce 自定义字段,字段名称按购买数量递增 1。
add_action('woocommerce_checkout_update_order_meta', 'customise_checkout_field_update_order_meta');
/**
* Save value of fields
*/
function customise_checkout_field_update_order_meta($order_id) {
// True
if ( WC()->cart ) {
// Specific product IDs
$product_ids = array( 11,12,13 );
// Initialize
$count = 0;
// Loop trough cart items quantities
foreach ( WC()->cart->get_cart_item_quantities() as $product_id => $cart_item_quantity ) {
// Checks if a value exists in an array
if ( in_array( $product_id, $product_ids ) ) {
$count += $cart_item_quantity;
}
}
$i = 0;
for($k=1; $k<= $count; $k++) {
$i++;
if (!empty($_POST['cstm_full_name'.$i])) {
update_post_meta($order_id, 'Name of Attendee '.$i, sanitize_text_field($_POST['cstm_full_name'.$i]));
}
}
}
}
效果很好,但我想在 WooCommerce 内部订单管理屏幕上显示字段,我如何遍历自定义字段并显示递增的字段名称...
add_action( 'woocommerce_admin_order_data_after_billing_address', 'bt_attendees_field_display_admin_order_meta', 10, 1 );
/**
* Display attendees value on the backend WooCommerce order
*/
function bt_attendees_field_display_admin_order_meta($order){
$i = 1;
echo '<p>Attendee Name ' . get_post_meta( $order->get_id(), 'Name of Attendee '.$i, true ) . '<p>';
}
因此,由于变量已设置为 1,第一个字段上方的内容将在上方输出 - 我如何循环遍历每个订单每个订单的不确定数量的相同字段。
有不同的方法,您可以使用 $order->get_meta_data()
从当前 $order
对象中获取所有元数据。然后你只显示以给定子字符串开头的值。
关于您当前代码的一些注释
woocommerce_checkout_create_order
钩子用于保存 woocommerce_checkout_update_order_meta
钩子,因为 $order
对象已经传递给回调函数
- 建议创建时不要使用空格
meta_keys
,这样会减少错误负担
所以你得到:
// Save meta data
function action_woocommerce_checkout_create_order( $order, $data ) {
// Count
$count = 6;
// Some value
$value = 'the_value_';
// Loop
for ( $i = 1; $i <= $count; $i++ ) {
// Update meta data
$order->update_meta_data( 'name_of_attendee_' . $i, $value . $i );
}
}
add_action( 'woocommerce_checkout_create_order', 'action_woocommerce_checkout_create_order', 10, 2 );
function action_woocommerce_admin_order_data_after_billing_address( $order ) {
// Get all meta data.
$meta_data = $order->get_meta_data();
// Loop through data
foreach ( $meta_data as $meta_data_obj ) {
$meta_data_array = $meta_data_obj->get_data();
// Checks if a string starts with a given substring
if ( str_starts_with( $meta_data_array['key'], 'name_of_attendee_' ) ) {
// Output value
echo '<p>Attendee name: ' . $meta_data_array['value'] . '<p>';
}
}
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'action_woocommerce_admin_order_data_after_billing_address', 10, 1 );
另一种方法是将$count
值添加为隐藏字段并将其值保存为订单元数据(除了其他所需数据)
然后你可以使用$count
值输出
function action_woocommerce_before_order_notes( $checkout ) {
// Count
$count = 10;
// Hidden field
echo '<input type="hidden" name="_count" value="' . $count . '">';
// Output of the other fields
// etc...
}
add_action( 'woocommerce_before_order_notes', 'action_woocommerce_before_order_notes', 10, 1 );
// Save
function action_woocommerce_checkout_create_order( $order, $data ) {
// Isset
if ( isset( $_POST['_count'] ) ) {
// Update meta data
$order->update_meta_data( '_count', sanitize_text_field( $_POST['_count'] ) );
}
// Save the other fields
// etc..
}
add_action( 'woocommerce_checkout_create_order', 'action_woocommerce_checkout_create_order', 10, 2 );
function action_woocommerce_admin_order_data_after_billing_address( $order ) {
// Get count
$count = $order->get_meta( '_count' );
for ( $i = 1; $i <= $count; $i++ ) {
echo '<p>Attendee Name... etc.. </p>';
// Get meta from the other fields
// $output = $order->get_meta( 'name_of_attendee_' . $i );
}
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'action_woocommerce_admin_order_data_after_billing_address', 10, 1 );
我有一个根据产品 ID 创建的 WooCommerce 自定义字段,字段名称按购买数量递增 1。
add_action('woocommerce_checkout_update_order_meta', 'customise_checkout_field_update_order_meta');
/**
* Save value of fields
*/
function customise_checkout_field_update_order_meta($order_id) {
// True
if ( WC()->cart ) {
// Specific product IDs
$product_ids = array( 11,12,13 );
// Initialize
$count = 0;
// Loop trough cart items quantities
foreach ( WC()->cart->get_cart_item_quantities() as $product_id => $cart_item_quantity ) {
// Checks if a value exists in an array
if ( in_array( $product_id, $product_ids ) ) {
$count += $cart_item_quantity;
}
}
$i = 0;
for($k=1; $k<= $count; $k++) {
$i++;
if (!empty($_POST['cstm_full_name'.$i])) {
update_post_meta($order_id, 'Name of Attendee '.$i, sanitize_text_field($_POST['cstm_full_name'.$i]));
}
}
}
}
效果很好,但我想在 WooCommerce 内部订单管理屏幕上显示字段,我如何遍历自定义字段并显示递增的字段名称...
add_action( 'woocommerce_admin_order_data_after_billing_address', 'bt_attendees_field_display_admin_order_meta', 10, 1 );
/**
* Display attendees value on the backend WooCommerce order
*/
function bt_attendees_field_display_admin_order_meta($order){
$i = 1;
echo '<p>Attendee Name ' . get_post_meta( $order->get_id(), 'Name of Attendee '.$i, true ) . '<p>';
}
因此,由于变量已设置为 1,第一个字段上方的内容将在上方输出 - 我如何循环遍历每个订单每个订单的不确定数量的相同字段。
有不同的方法,您可以使用 $order->get_meta_data()
从当前 $order
对象中获取所有元数据。然后你只显示以给定子字符串开头的值。
关于您当前代码的一些注释
woocommerce_checkout_create_order
钩子用于保存woocommerce_checkout_update_order_meta
钩子,因为$order
对象已经传递给回调函数- 建议创建时不要使用空格
meta_keys
,这样会减少错误负担
所以你得到:
// Save meta data
function action_woocommerce_checkout_create_order( $order, $data ) {
// Count
$count = 6;
// Some value
$value = 'the_value_';
// Loop
for ( $i = 1; $i <= $count; $i++ ) {
// Update meta data
$order->update_meta_data( 'name_of_attendee_' . $i, $value . $i );
}
}
add_action( 'woocommerce_checkout_create_order', 'action_woocommerce_checkout_create_order', 10, 2 );
function action_woocommerce_admin_order_data_after_billing_address( $order ) {
// Get all meta data.
$meta_data = $order->get_meta_data();
// Loop through data
foreach ( $meta_data as $meta_data_obj ) {
$meta_data_array = $meta_data_obj->get_data();
// Checks if a string starts with a given substring
if ( str_starts_with( $meta_data_array['key'], 'name_of_attendee_' ) ) {
// Output value
echo '<p>Attendee name: ' . $meta_data_array['value'] . '<p>';
}
}
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'action_woocommerce_admin_order_data_after_billing_address', 10, 1 );
另一种方法是将$count
值添加为隐藏字段并将其值保存为订单元数据(除了其他所需数据)
然后你可以使用$count
值输出
function action_woocommerce_before_order_notes( $checkout ) {
// Count
$count = 10;
// Hidden field
echo '<input type="hidden" name="_count" value="' . $count . '">';
// Output of the other fields
// etc...
}
add_action( 'woocommerce_before_order_notes', 'action_woocommerce_before_order_notes', 10, 1 );
// Save
function action_woocommerce_checkout_create_order( $order, $data ) {
// Isset
if ( isset( $_POST['_count'] ) ) {
// Update meta data
$order->update_meta_data( '_count', sanitize_text_field( $_POST['_count'] ) );
}
// Save the other fields
// etc..
}
add_action( 'woocommerce_checkout_create_order', 'action_woocommerce_checkout_create_order', 10, 2 );
function action_woocommerce_admin_order_data_after_billing_address( $order ) {
// Get count
$count = $order->get_meta( '_count' );
for ( $i = 1; $i <= $count; $i++ ) {
echo '<p>Attendee Name... etc.. </p>';
// Get meta from the other fields
// $output = $order->get_meta( 'name_of_attendee_' . $i );
}
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'action_woocommerce_admin_order_data_after_billing_address', 10, 1 );