Woocommerce echo общий объем розничных продаж по продукту

Я искал вокруг и, кажется, ничего не нашел. Прямо сейчас у меня есть запрос на отображение продуктов из моего магазина. Мне также нужно иметь возможность отображать в запросе общие продажи каждого продукта и общие розничные продажи каждого продукта. Я использую это, чтобы создать таблицу лидеров.

Общий объем продаж прост, это просто настраиваемое поле, которое 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)) {

РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: теперь я не получаю сообщений об ошибках.


person Tyler Ernst    schedule 23.09.2014    source источник
comment
В чем разница между общим объемом продаж и общим объемом розничных продаж?   -  person helgatheviking    schedule 24.09.2014
comment
Общий объем продаж - это количество проданного конкретного продукта. Общий объем розничных продаж - это общая сумма проданных товаров по цене. Так что, если было два продукта, проданных по 10,00 за штуку, должно получиться 20.   -  person Tyler Ernst    schedule 24.09.2014


Ответы (1)


Виджет панели управления 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 ) );
person helgatheviking    schedule 23.09.2014
comment
Ты обалденный. Общий объем розничных продаж за все время работает как шарм. Но индивидуальный идентификатор продукта, похоже, не работает, он просто выводит 0. Другой вопрос. Есть ли способ сделать так, чтобы он не отображался в теге ‹span class = amount›? Это оказывается проблемой при попытке использовать его в качестве идентификатора. Большое спасибо за помощь. - person Tyler Ernst; 25.09.2014
comment
Что ж, эта часть была выстрелом в темноте. Это wc_price(), который обертывает число в диапазоне, хотя он также форматирует его в денежную единицу. - person helgatheviking; 26.09.2014
comment
Чем больше я думаю об этом, тем больше я не думаю, что с помощью запроса можно получить общий объем продаж отдельного продукта. Я думаю, что вам, возможно, придется написать какую-то специальную функцию, которая обновляет и сохраняет итоги по каждому элементу всякий раз, когда заказ завершается. Может быть, как пост мета для самого предмета? Это не было бы невозможным, но и нелегко. - person helgatheviking; 26.09.2014
comment
хорошо, спасибо, что сняли форматирование. Это быстро выходит за рамки моих знаний. Итак, если у вас есть предложения, как это может выглядеть. Я с радостью попробую. Будет ли это работать так, как сейчас работает total_sales? - person Tyler Ernst; 26.09.2014
comment
Только в самом расплывчатом смысле, который я описал выше ... как в обновлении мета-ключа сообщения, когда заказ завершен. Думаю, вы поступили бы так же, когда вам вернут деньги за заказ? Тогда в конце вам нужно будет только get_post_meta() для определенного продукта. Это интересно, но я не могу ответить на этот вопрос прямо сейчас. - person helgatheviking; 26.09.2014
comment
@TylerErnst Я только что обнаружил, что WooCommerce уже реализует метод, который я описывал ... см. этот вопрос, поэтому общий объем продаж определенного товара можно получить как get_post_meta($product_id, 'total_sales', true); Изменить: вроде. total_sales - количество. - person helgatheviking; 29.11.2014