在 Woocommerce 管理员中创建手动订单时替换订单货币
Replace order currency when creating a manual order in Woocommerce admin
在 WooCommerce 中,当通过管理员创建和保存手动订单时,我试图用自定义元数据值替换订单货币值 (元键是 _wcj_order_currency
)
以下是相关元数据的 2 个屏幕截图(key/value 对):
订单币种:
自定义货币(来自 Booster 插件):
所以我想从_order_currency
元键 保存时 .
我使用的参考文献:
我的代码尝试:
// Saving (Updating) or doing an action when submitting
add_action( 'save_post', 'update_order_custom_field_value' );
function update_order_custom_field_value( $post_id ){
// Only for shop order
// if ( 'shop_order' != $_POST[ 'post_type' ] )
if ( 'shop_order')
return $post_id;
// Checking that is not an autosave
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return $post_id;
// Check the user’s permissions (for 'shop_manager' and 'administrator' user roles)
if ( ! current_user_can( 'edit_shop_order', $post_id ) )
return $post_id;
//Up to above is fine for Admin order
// Updating custom field data
if( isset( $_POST['_wcj_order_currency'] ) ) {
$order = wc_get_order( $post_id );
// Replacing and updating the value
update_post_meta( $post_id, '_order_currency', $_POST['_wcj_order_currency'] );
}}
// Testing output in order edit pages (below billing address):
//This displays the existing values well
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_order_custom_field_value' );
function display_order_custom_field_value( $order ){
echo '<p><strong>'.__('Order Currency').':</strong> <br/>' . get_post_meta( $order->get_id(), '_order_currency', true ) . '</p>';
echo '<p><strong>'.__('Booster Order Currency').':</strong> <br/>' . get_post_meta( $order->get_id(), '_wcj_order_currency', true ) . '</p>';
}
测试订单编辑页面的输出(在账单地址下方)。该代码运行良好。
但我无法让它工作并在创建订单时更新订单货币。
欢迎提供任何帮助。
要使您的脚本仅适用于新订单创建,请尝试重新访问以下代码(已注释):
// Save order data
add_action( 'save_post_shop_order', 'update_order_currency_on_creation', 1000 );
function update_order_currency_on_creation( $order_id ){
// Ensure that this is a manual new order
if( $created = get_post_meta( $order_id, '_created_via', true ) ) {
return $order_id;
}
// Checking that is not an autosave (not sure that this is really needed on Woocommerce orders)
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return $order_id;
}
// Check the user’s permissions (for 'shop_manager' and 'administrator' user roles)
if ( ! current_user_can( 'edit_shop_order', $order_id ) ) {
return $order_id;
}
## ---- Updating order currency ---- ##
// Get the WC_Order object
$order = wc_get_order($order_id);
// HERE below the Booster meta key for Order currency
$meta_key = '_wcj_order_currency';
// If Booster currency is already in database (in case of, to be sure)
if ( $value = $order->get_meta($meta_key) ) {
$order->set_currency( esc_attr($value) );
$order->save(); // Save order data
}
// If not, we get the posted Booster currency value (else)
elseif ( isset($_POST[$meta_key]) && ( $value = esc_attr($_POST[$meta_key]) ) ) {
$order->set_currency( esc_attr($_POST[$meta_key]) );
$order->save(); // Save order data
}
}
// Testing output in order edit pages (below billing address): This displays the existing values as well.
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_specific_order_details' );
function display_specific_order_details( $order ){
echo '<div><p><strong>'.__('Order Currency').':</strong> ' . $order->get_currency() . '</p>
<p><strong>'.__('Booster Order Currency').':</strong> ' . $order->get_meta( '_wcj_order_currency' ) . '</p></div>';
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。
在 WooCommerce 中,当通过管理员创建和保存手动订单时,我试图用自定义元数据值替换订单货币值 (元键是 _wcj_order_currency
)
以下是相关元数据的 2 个屏幕截图(key/value 对):
订单币种:
自定义货币(来自 Booster 插件):
所以我想从_order_currency
元键 保存时 .
我使用的参考文献:
我的代码尝试:
// Saving (Updating) or doing an action when submitting
add_action( 'save_post', 'update_order_custom_field_value' );
function update_order_custom_field_value( $post_id ){
// Only for shop order
// if ( 'shop_order' != $_POST[ 'post_type' ] )
if ( 'shop_order')
return $post_id;
// Checking that is not an autosave
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return $post_id;
// Check the user’s permissions (for 'shop_manager' and 'administrator' user roles)
if ( ! current_user_can( 'edit_shop_order', $post_id ) )
return $post_id;
//Up to above is fine for Admin order
// Updating custom field data
if( isset( $_POST['_wcj_order_currency'] ) ) {
$order = wc_get_order( $post_id );
// Replacing and updating the value
update_post_meta( $post_id, '_order_currency', $_POST['_wcj_order_currency'] );
}}
// Testing output in order edit pages (below billing address):
//This displays the existing values well
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_order_custom_field_value' );
function display_order_custom_field_value( $order ){
echo '<p><strong>'.__('Order Currency').':</strong> <br/>' . get_post_meta( $order->get_id(), '_order_currency', true ) . '</p>';
echo '<p><strong>'.__('Booster Order Currency').':</strong> <br/>' . get_post_meta( $order->get_id(), '_wcj_order_currency', true ) . '</p>';
}
测试订单编辑页面的输出(在账单地址下方)。该代码运行良好。
但我无法让它工作并在创建订单时更新订单货币。
欢迎提供任何帮助。
要使您的脚本仅适用于新订单创建,请尝试重新访问以下代码(已注释):
// Save order data
add_action( 'save_post_shop_order', 'update_order_currency_on_creation', 1000 );
function update_order_currency_on_creation( $order_id ){
// Ensure that this is a manual new order
if( $created = get_post_meta( $order_id, '_created_via', true ) ) {
return $order_id;
}
// Checking that is not an autosave (not sure that this is really needed on Woocommerce orders)
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return $order_id;
}
// Check the user’s permissions (for 'shop_manager' and 'administrator' user roles)
if ( ! current_user_can( 'edit_shop_order', $order_id ) ) {
return $order_id;
}
## ---- Updating order currency ---- ##
// Get the WC_Order object
$order = wc_get_order($order_id);
// HERE below the Booster meta key for Order currency
$meta_key = '_wcj_order_currency';
// If Booster currency is already in database (in case of, to be sure)
if ( $value = $order->get_meta($meta_key) ) {
$order->set_currency( esc_attr($value) );
$order->save(); // Save order data
}
// If not, we get the posted Booster currency value (else)
elseif ( isset($_POST[$meta_key]) && ( $value = esc_attr($_POST[$meta_key]) ) ) {
$order->set_currency( esc_attr($_POST[$meta_key]) );
$order->save(); // Save order data
}
}
// Testing output in order edit pages (below billing address): This displays the existing values as well.
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_specific_order_details' );
function display_specific_order_details( $order ){
echo '<div><p><strong>'.__('Order Currency').':</strong> ' . $order->get_currency() . '</p>
<p><strong>'.__('Booster Order Currency').':</strong> ' . $order->get_meta( '_wcj_order_currency' ) . '</p></div>';
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。