Я искал вокруг и не могу найти что-нибудь. Прямо сейчас у меня есть запрос, чтобы показать мои продукты из моего магазина. Мне нужно иметь возможность также отображать в запросе общие продажи каждого продукта и общие розничные продажи каждого продукта. Я использую это, чтобы создать таблицу лидеров.
Общий объем продаж прост, это просто настраиваемое поле, которое woocommerce вставляет для вас. У меня проблемы с поиском ответа для общих розничных продаж.
Мне также нужно отобразить общие розничные продажи всего магазина, но, похоже, ничто не поможет в этом.
У меня был код на эта страница работает, но затем плагин обновился и он перестал работать. Он просто показывал 0, а теперь ничего не показывает.
Вот мой запрос прямо сейчас, используя код с указанной выше страницы.
<?php $my_query = new WP_Query( array( 'post_type' => 'product', 'posts_per_page' => -1 ) );?>
<?php if ( $my_query->have_posts() ) : ?>
<?php $order_items = apply_filters( 'woocommerce_reports_top_earners_order_items', $wpdb->get_results( "SELECT order_item_meta_2.meta_value as product_id, SUM( order_item_meta.meta_value ) as line_total FROM {$wpdb->prefix}woocommerce_order_items as order_items
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta_2 ON order_items.order_item_id = order_item_meta_2.order_item_id
LEFT JOIN {$wpdb->posts} AS posts ON order_items.order_id = posts.ID
LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID = rel.object_ID
LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id )
LEFT JOIN {$wpdb->terms} AS term USING( term_id )
WHERE posts.post_type = 'shop_order'
AND posts.post_status = 'publish'
AND tax.taxonomy = 'shop_order_status'
AND term.slug IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "')
AND order_items.order_item_type = 'line_item'
AND order_item_meta.meta_key = '_line_total'
AND order_item_meta_2.meta_key = '_product_id'
GROUP BY order_item_meta_2.meta_value
" )); ?>
<?php while($my_query->have_posts()): $my_query->the_post(); ?><div id="<?php $totalDonations = 0;
$Charities = array($post->ID);
//Gather Total for Individual Items
foreach ($order_items as $item) {
if (in_array($item->product_id, $Charities)) {
$totalDonations = $item->line_total + $totalDonations;}
} echo $totalDonations; ?>" class="sort_by_total">
<div class="one_half">
<li><span><?php the_title(); ?></span></li>
</div>
<div class="one_quarter">
<p><?php echo get_post_meta($post->ID, 'total_sales', true); ?></p>
</div>
<div class="one_quarter last">
<p>$<?php echo $totalDonations; ?></p>
</div>
<div class="clear"></div>
<div class="divider"></div>
</div>
<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>
<?php wp_reset_query();?>
После того, как они отображаются, я использую общий объем розничных продаж в качестве идентификатора для каждого div и заказываю таблицу лидеров с помощью jquery. Вот почему он вызывается дважды в коде.
Любая помощь приветствуется. Спасибо
РЕДАКТИРОВАТЬ: я проверял сообщения об ошибках, и я получаю: PHP Fatal error: Using $this when not in object context on line 33
Также получена та же ошибка для строки 66. Строка 33 — это строка, которая начинается с <?php $order_items = apply_filters(
и линия 66 является линией, которая начинается if (in_array($item->product_id, $Charities)) {
РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: Теперь я не получаю никаких сообщений об ошибках.
Виджет панели мониторинга WooCommerce 2.2 использует следующий код для расчета розничных продаж за последний месяц:
// Sales
$query = array();
$query['fields'] = "SELECT SUM( postmeta.meta_value ) FROM {$wpdb->posts} as posts";
$query['join'] = "INNER JOIN {$wpdb->postmeta} AS postmeta ON posts.ID = postmeta.post_id ";
$query['where'] = "WHERE posts.post_type IN ( '" . implode( "','", wc_get_order_types( 'reports' ) ) . "' ) ";
$query['where'] .= "AND posts.post_status IN ( 'wc-" . implode( "','wc-", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "' ) ";
$query['where'] .= "AND postmeta.meta_key = '_order_total' ";
$query['where'] .= "AND posts.post_date >= '" . date( 'Y-m-01', current_time( 'timestamp' ) ) . "' ";
$query['where'] .= "AND posts.post_date <= '" . date( 'Y-m-d H:i:s', current_time( 'timestamp' ) ) . "' ";
$sales = $wpdb->get_var( implode( ' ', apply_filters( 'woocommerce_dashboard_status_widget_sales_query', $query ) ) );
затем позже отобразив его с помощью:
wc_price( $sales );
Поскольку даты ограничены в последних 2 строках $query['where']
Я предполагаю, что эти строки могут быть удалены, если вы хотите получить общий объем продаж за все время.
// All-time Sales for entire store
$query = array();
$query['fields'] = "SELECT SUM( postmeta.meta_value ) FROM {$wpdb->posts} as posts";
$query['join'] = "INNER JOIN {$wpdb->postmeta} AS postmeta ON posts.ID = postmeta.post_id ";
$query['where'] = "WHERE posts.post_type IN ( '" . implode( "','", wc_get_order_types( 'reports' ) ) . "' ) ";
$query['where'] .= "AND posts.post_status IN ( 'wc-" . implode( "','wc-", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "' ) ";
$query['where'] .= "AND postmeta.meta_key = '_order_total' ";
$sales = $wpdb->get_var( implode( ' ', $query ) );
Это кажется мне довольно интенсивным запросом, поэтому, если он будет выполняться постоянно, возможно, вы захотите исследовать переходные процессы.
Я менее уверен в том, чтобы модифицировать его для отдельного продукта, потому что я слаб в SQL, но вот попытка получить строку «где», чтобы указать идентификатор продукта.
// All-time Sales for specific product, maybe
$product_id = 10;
$query = array();
$query['fields'] = "SELECT SUM( postmeta.meta_value ) FROM {$wpdb->posts} as posts";
$query['join'] = "INNER JOIN {$wpdb->postmeta} AS postmeta ON posts.ID = postmeta.post_id ";
$query['where'] = sprintf( "WHERE posts.ID = %n", $product_id );
$query['where'] .= "AND posts.post_status IN ( 'wc-" . implode( "','wc-", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "' ) ";
$query['where'] .= "AND postmeta.meta_key = '_order_total' ";
$sales = $wpdb->get_var( implode( ' ', $query ) );
Других решений пока нет …