WooCommerce:在 SQL 查询中获取产品变体的总销售额
WooCommerce: Get the total sales for product variations in a SQL query
我正在为 reporting plugin 创建插件扩展。当前插件创建各种报告,包括基于每个产品的最畅销产品的报告。
我需要重新创建此设置以根据变体显示顶级产品。需要的字段是产品名称、SKU、销售数量、销售总额。
如何获取产品变体的数据?
我已经在下面输入了我当前的密码。
SQL查询及数据处理:
$phoen_product_query = "
SELECT
posts.post_title AS product_name,
meta.meta_key as mkey,
meta.meta_value as product_value,
posts.ID AS ID
FROM {$wpdb->posts} AS posts
LEFT JOIN {$wpdb->postmeta} AS meta
ON posts.ID = meta.post_id
WHERE
posts.post_status IN ( 'publish','private' )
AND posts.post_type IN ( 'product' )
AND meta.meta_key IN ( 'total_sales' ,'_price' ,'post_views_count', '_sku')
ORDER BY
posts.ID ASC,
meta.meta_key ASC
";
$phoen_product_data = $wpdb->get_results( $phoen_product_query,ARRAY_A);
foreach($phoen_product_data as $key1 => $valuee){
if(!isset( $phoen_top_products[$valuee['ID']])){
$phoen_top_products[$valuee['ID']] = Array();
$phoen_top_products[$valuee['ID']] = Array(
"produc_total" => 0,
"product_price" => 0,
"product_count" => 0,
"product_views" => 0
);
}
switch ($valuee['mkey']) {
case "_sku":
$phoen_top_products[$valuee['ID']]["product_sku"] = $valuee['product_value'];
break;
case "_price":
$phoen_top_products[$valuee['ID']]["product_price"] = $valuee['product_value'];
break;
case "post_views_count":
$phoen_top_products[$valuee['ID']]["product_views"] = $valuee['product_value'];
break;
case "total_sales":
$phoen_top_products[$valuee['ID']]["product_count"] = $valuee['product_value'];
$phoen_top_products[$valuee['ID']]["produc_total"] = $valuee['product_value'] * $phoen_top_products[$valuee['ID']]["product_price"];
$phoen_top_products[$valuee['ID']]["product_name"] = $valuee['product_name'];
$phoen_top_products[$valuee['ID']]["ID"] = $valuee['ID'];
break;
default:
break;
}
}
管理模块:
<table class="table table-striped table-bordered" id="phoen_top_product_table">
<thead>
<tr>
<th><?php _e( 'Product Name', 'advanced-reporting-for-woocommerce' ); ?></th>
<th><?php _e( 'SKU', 'advanced-reporting-for-woocommerce' ); ?></th>
<th><?php _e( 'Qty', 'advanced-reporting-for-woocommerce' ); ?></th>
<th><?php _e( 'Amount', 'advanced-reporting-for-woocommerce' ); ?></th>
</tr>
</thead>
<tbody>
<?php
$phoen_repot_product=array();
$phoen_product_count=0;
for($i=0; $i<count($phoen_top_products); $i++)
{
if($phoen_get_product_val!='View All')
{
if($phoen_product_count<$phoen_get_product_val)
{
?>
<tr class="phoen_top_product_tr">
<td>
<?php $phoen_product_title=isset($phoen_top_products[$i]['product_name'])?$phoen_top_products[$i]['product_name']:'';
echo $phoen_product_title; ?>
</td>
<td>
<?php $phoen_product_sku=isset($phoen_top_products[$i]['product_sku'])?$phoen_top_products[$i]['product_sku']:'';
echo $phoen_product_sku; ?>
</td>
<td>
<?php
$phoen_product_quentity=isset($phoen_top_products[$i]['product_count'])?$phoen_top_products[$i]['product_count']:'';
echo $phoen_product_quentity;
?>
</td>
<td>
<?php
$phoen_total_product_price=isset($phoen_top_products[$i]['produc_total'])?$phoen_top_products[$i]['produc_total']:'';
echo get_woocommerce_currency_symbol().($phoen_total_product_price);
?>
</td>
</tr>
<?php
$phoen_repot_product[$i]= array(
'name'=>$phoen_product_title,
'sku'=>$phoen_product_sku,
'product_count'=>$phoen_product_quentity,
'amount'=>$phoen_total_product_price
);
}
$phoen_product_count++;
}else{
?>
<tr class="phoen_top_product_tr">
<td>
<?php $phoen_product_title=isset($phoen_top_products[$i]['product_name'])?$phoen_top_products[$i]['product_name']:'';
echo $phoen_product_title; ?>
</td>
<td>
<?php $phoen_product_sku=isset($phoen_top_products[$i]['product_sku'])?$phoen_top_products[$i]['product_sku']:'';
echo $phoen_product_sku; ?>
</td>
<td>
<?php
$phoen_product_quentity=isset($phoen_top_products[$i]['product_count'])?$phoen_top_products[$i]['product_count']:'';
echo $phoen_product_quentity;
?>
</td>
<td>
<?php
$phoen_total_product_price=isset($phoen_top_products[$i]['produc_total'])?$phoen_top_products[$i]['produc_total']:'';
echo get_woocommerce_currency_symbol().($phoen_total_product_price);
?>
</td>
</tr>
<?php
$phoen_repot_product[$i]= array(
'name'=>$phoen_product_title,
'sku'=>$phoen_product_sku,
'product_count'=>$phoen_product_quentity,
'amount'=>$phoen_total_product_price
);
}
}
$phoen_product_file = fopen('phoen-repot-product.csv', 'w');
fputcsv($phoen_product_file, array('Product Name', 'SKU', 'Qty', 'Amount'));
foreach ($phoen_repot_product as $phoen_product_row)
{
fputcsv($phoen_product_file, $phoen_product_row);
}
fclose($phoen_product_file);
?>
</tbody>
在您的数据库查询中,您只是忘记了像 'product_variation'
这样的 post_type
。
您可以替换这一行:
AND posts.post_type IN ( 'product' )
由此:
AND posts.post_type IN ( 'product','product_variation' )
或者这个(更短):
AND posts.post_type LIKE 'product%'
您还将获得所有产品变体数据。 我已经测试了你的代码并且它有效。
(我只有 'post_views_count' 空,因为我认为这是一个自定义字段)。
我正在为 reporting plugin 创建插件扩展。当前插件创建各种报告,包括基于每个产品的最畅销产品的报告。
我需要重新创建此设置以根据变体显示顶级产品。需要的字段是产品名称、SKU、销售数量、销售总额。
如何获取产品变体的数据?
我已经在下面输入了我当前的密码。
SQL查询及数据处理:
$phoen_product_query = "
SELECT
posts.post_title AS product_name,
meta.meta_key as mkey,
meta.meta_value as product_value,
posts.ID AS ID
FROM {$wpdb->posts} AS posts
LEFT JOIN {$wpdb->postmeta} AS meta
ON posts.ID = meta.post_id
WHERE
posts.post_status IN ( 'publish','private' )
AND posts.post_type IN ( 'product' )
AND meta.meta_key IN ( 'total_sales' ,'_price' ,'post_views_count', '_sku')
ORDER BY
posts.ID ASC,
meta.meta_key ASC
";
$phoen_product_data = $wpdb->get_results( $phoen_product_query,ARRAY_A);
foreach($phoen_product_data as $key1 => $valuee){
if(!isset( $phoen_top_products[$valuee['ID']])){
$phoen_top_products[$valuee['ID']] = Array();
$phoen_top_products[$valuee['ID']] = Array(
"produc_total" => 0,
"product_price" => 0,
"product_count" => 0,
"product_views" => 0
);
}
switch ($valuee['mkey']) {
case "_sku":
$phoen_top_products[$valuee['ID']]["product_sku"] = $valuee['product_value'];
break;
case "_price":
$phoen_top_products[$valuee['ID']]["product_price"] = $valuee['product_value'];
break;
case "post_views_count":
$phoen_top_products[$valuee['ID']]["product_views"] = $valuee['product_value'];
break;
case "total_sales":
$phoen_top_products[$valuee['ID']]["product_count"] = $valuee['product_value'];
$phoen_top_products[$valuee['ID']]["produc_total"] = $valuee['product_value'] * $phoen_top_products[$valuee['ID']]["product_price"];
$phoen_top_products[$valuee['ID']]["product_name"] = $valuee['product_name'];
$phoen_top_products[$valuee['ID']]["ID"] = $valuee['ID'];
break;
default:
break;
}
}
管理模块:
<table class="table table-striped table-bordered" id="phoen_top_product_table">
<thead>
<tr>
<th><?php _e( 'Product Name', 'advanced-reporting-for-woocommerce' ); ?></th>
<th><?php _e( 'SKU', 'advanced-reporting-for-woocommerce' ); ?></th>
<th><?php _e( 'Qty', 'advanced-reporting-for-woocommerce' ); ?></th>
<th><?php _e( 'Amount', 'advanced-reporting-for-woocommerce' ); ?></th>
</tr>
</thead>
<tbody>
<?php
$phoen_repot_product=array();
$phoen_product_count=0;
for($i=0; $i<count($phoen_top_products); $i++)
{
if($phoen_get_product_val!='View All')
{
if($phoen_product_count<$phoen_get_product_val)
{
?>
<tr class="phoen_top_product_tr">
<td>
<?php $phoen_product_title=isset($phoen_top_products[$i]['product_name'])?$phoen_top_products[$i]['product_name']:'';
echo $phoen_product_title; ?>
</td>
<td>
<?php $phoen_product_sku=isset($phoen_top_products[$i]['product_sku'])?$phoen_top_products[$i]['product_sku']:'';
echo $phoen_product_sku; ?>
</td>
<td>
<?php
$phoen_product_quentity=isset($phoen_top_products[$i]['product_count'])?$phoen_top_products[$i]['product_count']:'';
echo $phoen_product_quentity;
?>
</td>
<td>
<?php
$phoen_total_product_price=isset($phoen_top_products[$i]['produc_total'])?$phoen_top_products[$i]['produc_total']:'';
echo get_woocommerce_currency_symbol().($phoen_total_product_price);
?>
</td>
</tr>
<?php
$phoen_repot_product[$i]= array(
'name'=>$phoen_product_title,
'sku'=>$phoen_product_sku,
'product_count'=>$phoen_product_quentity,
'amount'=>$phoen_total_product_price
);
}
$phoen_product_count++;
}else{
?>
<tr class="phoen_top_product_tr">
<td>
<?php $phoen_product_title=isset($phoen_top_products[$i]['product_name'])?$phoen_top_products[$i]['product_name']:'';
echo $phoen_product_title; ?>
</td>
<td>
<?php $phoen_product_sku=isset($phoen_top_products[$i]['product_sku'])?$phoen_top_products[$i]['product_sku']:'';
echo $phoen_product_sku; ?>
</td>
<td>
<?php
$phoen_product_quentity=isset($phoen_top_products[$i]['product_count'])?$phoen_top_products[$i]['product_count']:'';
echo $phoen_product_quentity;
?>
</td>
<td>
<?php
$phoen_total_product_price=isset($phoen_top_products[$i]['produc_total'])?$phoen_top_products[$i]['produc_total']:'';
echo get_woocommerce_currency_symbol().($phoen_total_product_price);
?>
</td>
</tr>
<?php
$phoen_repot_product[$i]= array(
'name'=>$phoen_product_title,
'sku'=>$phoen_product_sku,
'product_count'=>$phoen_product_quentity,
'amount'=>$phoen_total_product_price
);
}
}
$phoen_product_file = fopen('phoen-repot-product.csv', 'w');
fputcsv($phoen_product_file, array('Product Name', 'SKU', 'Qty', 'Amount'));
foreach ($phoen_repot_product as $phoen_product_row)
{
fputcsv($phoen_product_file, $phoen_product_row);
}
fclose($phoen_product_file);
?>
</tbody>
在您的数据库查询中,您只是忘记了像 'product_variation'
这样的 post_type
。
您可以替换这一行:
AND posts.post_type IN ( 'product' )
由此:
AND posts.post_type IN ( 'product','product_variation' )
或者这个(更短):
AND posts.post_type LIKE 'product%'
您还将获得所有产品变体数据。 我已经测试了你的代码并且它有效。
(我只有 'post_views_count' 空,因为我认为这是一个自定义字段)。