Раньше я использовал плагин, чтобы добавлять общий вес заказа к каждому заказу и отображать его на странице заказов в серверной части. Однако HPOS нарушил это, и я пытался написать код для его реализации снова. У меня есть Франкенштейн несколько фрагментов, которые я нашел, так как мои навыки PHP очень ограничены, и это все, что я понял, я просто не могу заставить его заполнять значения.
Я знаю, что многие из вас посмотрят на это и скажут себе: какой идиот, но, надеюсь, кто-нибудь сможет указать мне правильное направление.
add_filter( 'manage_woocommerce_page_wc-orders_columns', 'add_order_weight_column' );
function add_order_weight_column( $columns ) {
$columns['total_weight'] = __( 'Weight', 'woocommerce' );
return $columns;
}
add_action( 'manage_shop_order_posts_custom_column', 'populate_order_weight_column_content', 10, 2 );
function populate_order_weight_column_content( $column ) {
if ( $column == 'total_weight' ) {
global $the_order;
$total_weight = $the_order->get_meta('_cart_weight');
if ( $total_weight > 0 ) {
echo wc_format_weight( $total_weight );
} else {
_e('N/A', 'woocommerce');
}
}
}
Столбец не обязательно должен быть сортируемым, мне просто нужно отобразить общий вес.
Основная проблема в вашем коде заключается в том, что вы не используете правый крючок во второй функции, когда HPOS включен, поэтому в вашем настраиваемом столбце ничего не отображается.
Убедитесь, что «_cart_weight» — это правильный метаключ, используемый для регистрации общего веса (см. дополнение ниже, посвященное проблемам совместимости).
Следующее будет работать с включенным HPOS или без него:
add_filter( 'manage_woocommerce_page_wc-orders_columns', 'add_custom_columns_to_admin_orders', 20); // HPOS
add_filter( 'manage_edit-shop_order_columns', 'add_custom_columns_to_admin_orders', 20);
function add_custom_columns_to_admin_orders( $columns ) {
return array_merge( $columns, ['total_weight' => __( 'Weight', 'woocommerce' )] );
}
add_action('manage_woocommerce_page_wc-orders_custom_column', 'custom_columns_content_in_admin_orders', 10, 2); // HPOS
add_action( 'manage_shop_order_posts_custom_column', 'custom_columns_content_in_admin_orders', 10, 2);
function custom_columns_content_in_admin_orders( $column, $order ) {
if ( ! is_a($order, 'WC_order') && $order > 0 ) {
$order = wc_get_order( $order );
}
if ( 'total_weight' === $column ) {
$total_weight = $order->get_meta('_cart_weight');
echo $total_weight > 0 ? wc_format_weight($total_weight) : __('N/A', 'woocommerce');
}
}
Код находится в файле function.php вашей дочерней темы (или в плагине).
Если зарегистрированный общий вес несовместим с HPOS, это означает, что код, используемый для регистрации общего веса, использует метафункцию записи WordPress вместо использования необходимого метода установки WooCommerce, совместимого с HPOS.
add_action('woocommerce_checkout_create_order', 'add_checkout_order_total_weight', 100);
function add_checkout_order_total_weight( $order ) {
$order->update_meta_data('_cart_weight', WC()->cart->get_cart_contents_weight());
}
Обязательно удалите старый код (или соответствующие функции стороннего плагина).
add_action( 'woocommerce_process_shop_order_meta', 'add_edit_admin_order_total_weight', 60 );
function add_edit_admin_order_total_weight( $order_id ) {
$order = wc_get_order($order_id); // Get WC_Order instance
$total_weight = 0; // Initializing
// Loop through order items
foreach ( $order->get_items() as $item ) {
$product = $item->get_product(); // Get WC_Product instance
$weight = (float) $product->get_weight(); // Get product weight
$total_weight += $weight > 0 ? $item->get_quantity() * $weight : 0; // Increase total weight
}
$initial_total_weight = (float) $order->get_meta('_cart_weight'); // Check initial
if ( $initial_total_weight !== $total_weight ) {
$order->update_meta_data('_cart_weight', WC()->cart->get_cart_contents_weight());
$order->save();
}
}
Как снова запустить синхронизацию WooCommerce HPOS для ранее синхронизированных заказов?
Связанный:
Спасибо LoicTheAztec, это помогло, однако теперь я просто получаю список неприменимых сумм. Я предполагаю, что это связано с тем, что метаключ не получает нужные мне данные. Я попытался заполнить метаключ этим кодом: 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() ) ); } но все равно не повезло