我目前有一个脚本计算并在我的 woocommerce 网站订单页面的单独列中显示每个订单的权重。这很有效,但意味着每次页面加载时都必须重新计算所有内容。
我找到了一个保存订单权重的脚本,但我的 php 知识还不够好,无法结合这两个脚本。这会是什么样子?也就是说,显示保存的重量而不是每次都计算?
保存脚本:
add_action( 'woocommerce_checkout_update_order_meta', 'solhatt_save_weight_order' );
function solhatt_save_weight_order( $order_id ) {
$weight = WC()->cart->get_cart_contents_weight();
update_post_meta( $order_id, '_cart_weight', $weight );
}
计算脚本:
add_filter( 'manage_edit-shop_order_columns', 'woo_order_weight_column' );
function woo_order_weight_column( $columns ) {
$columns['total_weight'] = __( 'Weight', 'woocommerce' );
return $columns;
}
add_action( 'manage_shop_order_posts_custom_column', 'woo_custom_order_weight_column', 2 );
function woo_custom_order_weight_column( $column ) {
global $post, $woocommerce, $the_order;
if ( empty( $the_order ) || $the_order->get_id() !== $post->ID )
$the_order = new WC_Order( $post->ID );
if ( $column == 'total_weight' ) {
$weight = 0;
if ( sizeof( $the_order->get_items() ) > 0 ) {
foreach( $the_order->get_items() as $item ) {
if ( $item['product_id'] > 0 ) {
$_product = $item->get_product();
if ( ! $_product->is_virtual() ) {
$weight += $_product->get_weight() * $item['qty'];
}
}
}
}
if ( $weight > 0 ) {
print $weight . ' ' . esc_attr( get_option('woocommerce_weight_unit' ) );
} else {
print 'N/A';
}
}
}
我的 php 知识还不够好,我尝试将两者结合起来,但出现了错误......
将所有代码(包括第一个函数)替换为以下代码,该代码将直接使用管理订单列表中的“_cart_weight”元数据,以显示格式化的总重量:
add_action( 'woocommerce_checkout_create_order', 'add_order_total_weight_metadata' );
function add_order_total_weight_metadata( $order ) {
$order->add_meta_data('_cart_weight', intval( WC()->cart->get_cart_contents_weight() ) );
}
add_filter( 'manage_edit-shop_order_columns', 'woo_order_weight_column' );
function woo_order_weight_column( $columns ) {
$columns['total_weight'] = __( 'Weight', 'woocommerce' );
return $columns;
}
add_action( 'manage_shop_order_posts_custom_column', 'woo_custom_order_weight_column', 2 );
function woo_custom_order_weight_column( $column ) {
if ( $column == 'total_weight' ) {
global $the_order;
// Get total weight metadata value
$total_weight = $the_order->get_meta('_cart_weight');
if ( $total_weight > 0 ) {
echo wc_format_weight( $total_weight );
} else {
_e('N/A', 'woocommerce');
}
}
}
代码位于子主题的functions.php 文件中(或插件中)。应该可以。