[英]WooCommerce: Dynamic Custom Checkout Fields in admin
我在向訂單管理員添加自定義結帳字段時遇到了問題(也許還有電子郵件,但我還沒有)。 除了編碼問題,我主要關注https://www.kathyisawesome.com/woocommerce-customize-checkout-fields/-到目前為止,這是我的代碼:
假設購物車中有一種產品,我會根據產品數量添加“ x”美元的$ fields ['extra_fields']數量。 我在kia_display_order_data_in_admin()中苦苦掙扎-不管做什么,我總是被get_country()所困擾。 我在pastebin中有非動態變化(基於購物車中有兩個產品)-我試圖使該零件動態化的所有其他操作均不起作用。
我看到一些選項可以將這些動態字段加載到admin中,但我無法到達那里:
再次獲取產品數量並將$ i附加到標准字段名稱的末尾
以某種方式獲取所有字段的數組,以便提取$ fields ['extra_fields']
通過order_id獲取extra_fields發布元
還有嗎
編輯:在起亞的幫助下,我對代碼進行了一些修改,現在它將動態添加自定義結帳字段。 這一直到管理訂單屏幕都有效,但是在嘗試更新admin kia_save_extra_details()
訂單詳細信息時將不起作用
編輯2:請參閱下面接受的答案,因為這適用於我的問題
您確定產品附加組件可能不適用於此嗎? 如果沒有,我認為您需要的是自定義輸入類型。 這應該使您入門。
/* Add a new checkout field
*
* These is our base field group, later on, depending on product quanitiy, $key = 'passenger_title_1' for example
*
*/
function supreme_filter_checkout_fields($fields){
$fields['extra_fields'] = array(
'passenger_details' => array(
'type' => 'passenger_details',
'required' => false,
'label' => __( 'Passenger Details' )
),
);
return $fields;
}
add_filter( 'woocommerce_checkout_fields', 'supreme_filter_checkout_fields' );
“ passenger_details”輸入到底是什么? 好吧,我們要定義它,因為woocommerce_form_field()
具有萬能的功能,以防類型與WooCommerce的任何默認值都不匹配。 參見'woocommerce_form_field_' . $args['type']
'woocommerce_form_field_' . $args['type']
這是我們要列出每個乘客想要的字段組的地方。
function supreme_filter_checkout_field_group( $field, $key, $args, $value ){
$op_cart_count = WC()->cart->get_cart_contents_count();
$html = '';
for ( $i = 1; $i <= $op_cart_count; $i++) {
$html .= woocommerce_form_field( "passenger_details[$i][title]", array(
"type" => "select",
"return" => true,
"value" => "",
"options" => array( "mr" => __( "Mr" ), "mrs" => __( "Mrs" ), "miss" => __( "Miss" ) ),
"required" => false,
"label" => __( "Title" )
)
);
$html .= woocommerce_form_field( "passenger_details[$i][first_name]", array(
"type" => "text",
"return" => true,
"value" => "",
"required" => false,
"label" => __( "First Name" )
)
);
$html .= woocommerce_form_field( "passenger_details[$i][middle_name]", array(
"type" => "text",
"return" => true,
"value" => "",
"required" => false,
"label" => __( "Middle Name" )
)
);
$html .= woocommerce_form_field( "passenger_details[$i][last_name]", array(
"type" => "text",
"return" => true,
"value" => "",
"required" => false,
"label" => __( "Last Name" )
)
);
$html .= woocommerce_form_field( "passenger_details[$i][date_of_birth]", array(
"type" => "text",
"return" => true,
"value" => "",
"class" => array("date-of-birth form-row-wide"),
"required" => false,
"label" => __("Date of Birth"),
"placeholder" => __("Select Date"),
"options" => array("" => __("Date of Birth", "woocommerce" ))
)
);
$html .= woocommerce_form_field( "passenger_details[$i][dietary_required]", array(
"type" => "select",
"return" => true,
"value" => "",
"class" => array("dietary-required form-row-wide"),
"options" => array( "" => __( "Please Select" ), "y" => __( "Yes" ), "n" => __( "No" ) ),
"required" => false,
"label" => __( "Dietary Requirements?" )
)
);
$html .= woocommerce_form_field( "passenger_details[$i][dietary_preference]", array(
"type" => "select",
"return" => true,
"value" => "",
"class" => array("dietary-requirements form-row-wide"),
"options" => array( "v" => __( "Vegetarian" ), "GF" => __( "Gluten Free" ) ),
"required" => false,
"label" => __( "Meal Preferences" )
)
);
}
return $html;
}
add_filter( 'woocommerce_form_field_passenger_details', 'supreme_filter_checkout_field_group', 10, 4 );
// display the extra field on the checkout form
function supreme_extra_checkout_fields(){
$checkout = WC()->checkout();
foreach ( $checkout->checkout_fields['extra_fields'] as $key => $field ) :
woocommerce_form_field( $key, $field, $checkout->get_value( $key ) );
endforeach;
}
add_action( 'woocommerce_checkout_after_customer_details' ,'supreme_extra_checkout_fields' );
編輯處理和保存數據。 請注意,我在上面更改了supreme_filter_checkout_field_group
函數,並刪除了ID參數。
~~使用id
參數,我們可以動態設置輸入名稱。 結果標記應該是這樣的:~~
<input type="text" class="input-text " name="last_name" id="passenger_details[2]last_name" placeholder="" value="">
錯了 name
參數必須是一個數組! 然后從woocommerce_form_field()
的第一個參數中woocommerce_form_field()
名稱。 該ID與我們的需求無關,盡管它需要唯一以維護正確的標記。 這是我們需要的結果,現在應該通過上述修改得到:
<input type="text" class="input-text " name="passenger_details[2][last_name]" id="passenger_details[2][last_name]" placeholder="" value="">
現在,提交$_POST['passenger_data']
應該是一個數組(乘客)的數組(乘客詳細信息)。 在我編輯之后,它就是!
現在,為了處理此數據並清理乘客數據中的各個字段,我們創建了一個用於清理自定義字段類型的函數:
/**
* Sanitize our custom field
*
*/
function supreme_custom_process_checkout_field_passenger_details( $posted ){
$clean = array();
foreach( $posted as $passenger ){
$details = supreme_custom_checkout_clean_passenger_details( $passenger );
if( ! empty( $details ) ){
$clean[] = $details;
}
}
return $clean;
}
add_filter( 'woocommerce_process_checkout_passenger_details_field', 'supreme_custom_process_checkout_field_passenger_details' );
function supreme_custom_checkout_clean_passenger_details( $passenger = array() ){
$details = array();
if( isset( $passenger["title"] ) ){
$details['title'] = sanitize_text_field( $passenger["title"] );
}
if( isset( $passenger["first_name"] ) ){
$details['first_name'] = sanitize_text_field( $passenger["first_name"] );
}
if( isset( $passenger["middle_name"] ) ){
$details['middle_name'] = sanitize_text_field( $passenger["middle_name"] );
}
if( isset( $passenger["last_name"] ) ){
$details['last_name'] = sanitize_text_field( $passenger["last_name"] );
}
if( isset( $passenger["date_of_birth"] ) ){
$details['date_of_birth'] = $date = preg_replace("([^0-9/])", "", $passenger["date_of_birth"] );
}
if( isset( $passenger["dietary_required"] ) ){
$details['dietary_required'] = $passenger["dietary_required"] == "y" ? "y": "n";
}
if( isset( $passenger["dietary_preference"] ) && isset( $passenger["dietary_required"] ) && $passenger["dietary_required"] == "y" ){
$details['dietary_preference'] = $passenger["dietary_preference"] == "GF" ? "GF": "v";
}
return $details;
}
現在已經清理完畢,更新僅是保存post meta的問題:
/**
* update_post_meta
*
*/
function supreme_custom_checkout_field_update_order_meta( $order_id, $posted ){
if( ! empty( $posted["passenger_details"] ) ){
update_post_meta( $order_id, "_passenger_details", $posted["passenger_details"] );
} else {
delete_post_meta( $order_id, "_passenger_details" );
}
}
add_action( 'woocommerce_checkout_update_order_meta', 'supreme_custom_checkout_field_update_order_meta', 10, 2 );
現在,我們肯定將所有字段保存在_passenger_details
post元鍵中,並且我們可以在需要顯示它的任何時間遍歷該數組。 例如,在管理訂單頁面上:
// display the extra data in the order admin panel
function kia_display_order_data_in_admin( $order ){
$passenger_details = get_post_meta( $order->id, "_passenger_details", true );
if( ! empty( $passenger_details ) ) {
$passenger_defaults = array(
"title" => "",
"first_name" => "",
"middle_name" => "",
"last_name" => "",
"date_of_birth" => "",
"dietary_required" => "",
"dietary_preference" => ""
);
?>
<div class="passenger_data">
<h4><?php _e( "Passenger Details", "your-slug" ); ?></h4>
<?php
$i = 1;
foreach( $passenger_details as $passenger ){
$passenger = wp_parse_args( $passenger, $passenger_defaults );
echo "<p><strong>" . sprintf( __( "Passenger #%s", "your-slug" ), $i ) . "</strong>" . "<br/>";
echo __( "Title", "your-slug" ) . ' : ' . $passenger["title"] . "<br/>";
echo __( "First Name", "your-slug" ) . ' : ' . $passenger["first_name"] . "<br/>";
echo __( "Middle Name", "your-slug" ) . ' : ' . $passenger["middle_name"] . "<br/>";
echo __( "Last Name", "your-slug" ) . ' : ' . $passenger["last_name"] . "<br/>";
echo __( "Date of Birth", "your-slug" ) . ' : ' . $passenger["date_of_birth"] . "<br/>";
echo __( "Dietary Required", "your-slug" ) . ' : ' . $passenger["dietary_required"] . "<br/>";
echo __( "Dietary Preference", "your-slug" ) . ' : ' . $passenger["dietary_preference"] . "<br/>";
echo "</p>";
$i++;
}
?>
</div>
<?php }
}
add_action( "woocommerce_admin_order_data_after_order_details", "kia_display_order_data_in_admin" );
現在仍然留下了感謝頁面和電子郵件,但是數據在那里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.