2013-07-25 14:00:23 +00:00
< ? php
/**
* Admin Dashboard
*
2014-11-30 06:52:32 +00:00
* @ author WooThemes
* @ category Admin
* @ package WooCommerce / Admin
2013-07-25 14:00:23 +00:00
* @ version 2.1 . 0
*/
2014-09-20 19:52:30 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
exit ; // Exit if accessed directly
}
2013-07-25 14:00:23 +00:00
if ( ! class_exists ( 'WC_Admin_Dashboard' ) ) :
/**
* WC_Admin_Dashboard Class
*/
class WC_Admin_Dashboard {
/**
* Hook in tabs .
*/
public function __construct () {
// Only hook in admin parts if the user has admin access
2014-01-11 00:18:28 +00:00
if ( current_user_can ( 'view_woocommerce_reports' ) || current_user_can ( 'manage_woocommerce' ) || current_user_can ( 'publish_shop_orders' ) ) {
2013-07-25 14:00:23 +00:00
add_action ( 'wp_dashboard_setup' , array ( $this , 'init' ) );
2014-01-11 00:18:28 +00:00
}
2013-07-25 14:00:23 +00:00
}
/**
* Init dashboard widgets
*/
public function init () {
if ( current_user_can ( 'publish_shop_orders' ) ) {
wp_add_dashboard_widget ( 'woocommerce_dashboard_recent_reviews' , __ ( 'WooCommerce Recent Reviews' , 'woocommerce' ), array ( $this , 'recent_reviews' ) );
}
wp_add_dashboard_widget ( 'woocommerce_dashboard_status' , __ ( 'WooCommerce Status' , 'woocommerce' ), array ( $this , 'status_widget' ) );
}
/**
* Show status widget
*/
public function status_widget () {
global $wpdb ;
include_once ( 'reports/class-wc-admin-report.php' );
$reports = new WC_Admin_Report ();
2014-05-28 14:19:16 +00:00
// Sales
$query = array ();
$query [ 'fields' ] = " SELECT SUM( postmeta.meta_value ) FROM { $wpdb -> posts } as posts " ;
2015-02-13 13:53:01 +00:00
$query [ 'join' ] = " INNER JOIN { $wpdb -> postmeta } AS postmeta ON posts.ID = postmeta.post_id LEFT JOIN { $wpdb -> posts } AS parent ON posts.post_parent = parent.ID " ;
$query [ 'where' ] = " WHERE posts.post_type IN ( ' " . implode ( " ',' " , array_merge ( wc_get_order_types ( 'sales-reports' ), array ( 'shop_order_refund' ) ) ) . " ' ) " ;
$query [ 'where' ] .= " AND posts.post_status IN ( 'wc- " . implode ( " ','wc- " , apply_filters ( 'woocommerce_reports_order_statuses' , array ( 'completed' , 'processing' , 'on-hold' ) ) ) . " ' ) " ;
$query [ 'where' ] .= " AND ( parent.post_status IN ( 'wc- " . implode ( " ','wc- " , apply_filters ( 'woocommerce_reports_order_statuses' , array ( 'completed' , 'processing' , 'on-hold' ) ) ) . " ' ) OR parent.ID IS NULL ) " ;
2014-05-28 14:19:16 +00:00
$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 ) ) );
2013-07-25 14:00:23 +00:00
// Get top seller
2014-05-28 14:19:16 +00:00
$query = array ();
$query [ 'fields' ] = " SELECT SUM( order_item_meta.meta_value ) as qty, order_item_meta_2.meta_value as product_id
FROM { $wpdb -> posts } as posts " ;
2014-05-30 17:29:53 +00:00
$query [ 'join' ] = " INNER JOIN { $wpdb -> prefix } woocommerce_order_items AS order_items ON posts.ID = order_id " ;
2014-05-28 14:19:16 +00:00
$query [ 'join' ] .= " INNER JOIN { $wpdb -> prefix } woocommerce_order_itemmeta AS order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id " ;
$query [ 'join' ] .= " INNER JOIN { $wpdb -> prefix } woocommerce_order_itemmeta AS order_item_meta_2 ON order_items.order_item_id = order_item_meta_2.order_item_id " ;
2014-07-25 14:48:37 +00:00
$query [ 'where' ] = " WHERE posts.post_type IN ( ' " . implode ( " ',' " , wc_get_order_types ( 'order-count' ) ) . " ' ) " ;
2014-06-03 10:29:01 +00:00
$query [ 'where' ] .= " AND posts.post_status IN ( 'wc- " . implode ( " ','wc- " , apply_filters ( 'woocommerce_reports_order_statuses' , array ( 'completed' , 'processing' , 'on-hold' ) ) ) . " ' ) " ;
2014-05-28 14:19:16 +00:00
$query [ 'where' ] .= " AND order_item_meta.meta_key = '_qty' " ;
$query [ 'where' ] .= " AND order_item_meta_2.meta_key = '_product_id' " ;
$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' ) ) . " ' " ;
$query [ 'groupby' ] = " GROUP BY product_id " ;
$query [ 'orderby' ] = " ORDER BY qty DESC " ;
$query [ 'limits' ] = " LIMIT 1 " ;
$top_seller = $wpdb -> get_row ( implode ( ' ' , apply_filters ( 'woocommerce_dashboard_status_widget_top_seller_query' , $query ) ) );
2013-07-25 14:00:23 +00:00
// Counts
2014-07-11 11:43:42 +00:00
$on_hold_count = 0 ;
$processing_count = 0 ;
foreach ( wc_get_order_types ( 'order-count' ) as $type ) {
$counts = ( array ) wp_count_posts ( $type );
$on_hold_count += isset ( $counts [ 'wc-on-hold' ] ) ? $counts [ 'wc-on-hold' ] : 0 ;
2014-07-11 18:03:34 +00:00
$processing_count += isset ( $counts [ 'wc-processing' ] ) ? $counts [ 'wc-processing' ] : 0 ;
2014-07-11 11:43:42 +00:00
}
2013-07-25 14:00:23 +00:00
// Get products using a query - this is too advanced for get_posts :(
$stock = absint ( max ( get_option ( 'woocommerce_notify_low_stock_amount' ), 1 ) );
$nostock = absint ( max ( get_option ( 'woocommerce_notify_no_stock_amount' ), 0 ) );
$query_from = " FROM { $wpdb -> posts } as posts
INNER JOIN { $wpdb -> postmeta } AS postmeta ON posts . ID = postmeta . post_id
INNER JOIN { $wpdb -> postmeta } AS postmeta2 ON posts . ID = postmeta2 . post_id
WHERE 1 = 1
AND posts . post_type IN ( 'product' , 'product_variation' )
AND posts . post_status = 'publish'
AND (
postmeta . meta_key = '_stock' AND CAST ( postmeta . meta_value AS SIGNED ) <= '{$stock}' AND CAST ( postmeta . meta_value AS SIGNED ) > '{$nostock}' AND postmeta . meta_value != ''
)
AND (
( postmeta2 . meta_key = '_manage_stock' AND postmeta2 . meta_value = 'yes' ) OR ( posts . post_type = 'product_variation' )
)
" ;
$lowinstock_count = absint ( $wpdb -> get_var ( " SELECT COUNT( DISTINCT posts.ID ) { $query_from } ; " ) );
$query_from = " FROM { $wpdb -> posts } as posts
INNER JOIN { $wpdb -> postmeta } AS postmeta ON posts . ID = postmeta . post_id
INNER JOIN { $wpdb -> postmeta } AS postmeta2 ON posts . ID = postmeta2 . post_id
WHERE 1 = 1
AND posts . post_type IN ( 'product' , 'product_variation' )
2014-01-11 00:15:33 +00:00
AND posts . post_status = 'publish'
AND (
2014-02-14 05:06:30 +00:00
postmeta . meta_key = '_stock' AND CAST ( postmeta . meta_value AS SIGNED ) <= '{$nostock}' AND postmeta . meta_value != ''
2014-01-11 00:15:33 +00:00
)
AND (
( postmeta2 . meta_key = '_manage_stock' AND postmeta2 . meta_value = 'yes' ) OR ( posts . post_type = 'product_variation' )
)
2013-07-25 14:00:23 +00:00
" ;
$outofstock_count = absint ( $wpdb -> get_var ( " SELECT COUNT( DISTINCT posts.ID ) { $query_from } ; " ) );
?>
< ul class = " wc_status_list " >
< li class = " sales-this-month " >
2013-10-22 16:26:18 +00:00
< a href = " <?php echo admin_url( 'admin.php?page=wc-reports&tab=orders&range=month' ); ?> " >
2014-01-11 00:18:28 +00:00
< ? php echo $reports -> sales_sparkline ( '' , max ( 7 , date ( 'd' , current_time ( 'timestamp' ) ) ) ); ?>
2013-11-25 13:34:21 +00:00
< ? php printf ( __ ( " <strong>%s</strong> sales this month " , 'woocommerce' ), wc_price ( $sales ) ); ?>
2013-07-25 14:00:23 +00:00
</ a >
</ li >
2013-07-31 16:47:33 +00:00
< ? php if ( $top_seller && $top_seller -> qty ) : ?>
2013-07-25 14:00:23 +00:00
< li class = " best-seller-this-month " >
2013-10-22 16:26:18 +00:00
< a href = " <?php echo admin_url( 'admin.php?page=wc-reports&tab=orders&report=sales_by_product&range=month&product_ids=' . $top_seller->product_id ); ?> " >
2014-01-11 00:18:28 +00:00
< ? php echo $reports -> sales_sparkline ( $top_seller -> product_id , max ( 7 , date ( 'd' , current_time ( 'timestamp' ) ) ), 'count' ); ?>
2013-07-25 14:00:23 +00:00
< ? php printf ( __ ( " %s top seller this month (sold %d) " , 'woocommerce' ), " <strong> " . get_the_title ( $top_seller -> product_id ) . " </strong> " , $top_seller -> qty ); ?>
</ a >
</ li >
< ? php endif ; ?>
< li class = " processing-orders " >
2014-11-04 08:22:28 +00:00
< a href = " <?php echo admin_url( 'edit.php?post_status=wc-processing&post_type=shop_order' ); ?> " >
2013-11-25 10:38:47 +00:00
< ? php printf ( _n ( " <strong>%s order</strong> awaiting processing " , " <strong>%s orders</strong> awaiting processing " , $processing_count , 'woocommerce' ), $processing_count ); ?>
2013-07-25 14:00:23 +00:00
</ a >
</ li >
< li class = " on-hold-orders " >
2014-11-04 08:22:28 +00:00
< a href = " <?php echo admin_url( 'edit.php?post_status=wc-on-hold&post_type=shop_order' ); ?> " >
2013-11-25 10:38:47 +00:00
< ? php printf ( _n ( " <strong>%s order</strong> on-hold " , " <strong>%s orders</strong> on-hold " , $on_hold_count , 'woocommerce' ), $on_hold_count ); ?>
2013-07-25 14:00:23 +00:00
</ a >
</ li >
< li class = " low-in-stock " >
2013-10-22 16:26:18 +00:00
< a href = " <?php echo admin_url( 'admin.php?page=wc-reports&tab=stock&report=low_in_stock' ); ?> " >
2013-11-25 10:38:47 +00:00
< ? php printf ( _n ( " <strong>%s product</strong> low in stock " , " <strong>%s products</strong> low in stock " , $lowinstock_count , 'woocommerce' ), $lowinstock_count ); ?>
2013-07-25 14:00:23 +00:00
</ a >
</ li >
< li class = " out-of-stock " >
2013-10-22 16:26:18 +00:00
< a href = " <?php echo admin_url( 'admin.php?page=wc-reports&tab=stock&report=out_of_stock' ); ?> " >
2013-11-25 10:38:47 +00:00
< ? php printf ( _n ( " <strong>%s product</strong> out of stock " , " <strong>%s products</strong> out of stock " , $outofstock_count , 'woocommerce' ), $outofstock_count ); ?>
2013-07-25 14:00:23 +00:00
</ a >
</ li >
</ ul >
< ? php
}
/**
* Recent reviews widget
*/
public function recent_reviews () {
global $wpdb ;
$comments = $wpdb -> get_results ( " SELECT *, SUBSTRING(comment_content,1,100) AS comment_excerpt
FROM $wpdb -> comments
LEFT JOIN $wpdb -> posts ON ( $wpdb -> comments . comment_post_ID = $wpdb -> posts . ID )
WHERE comment_approved = '1'
AND comment_type = ''
AND post_password = ''
AND post_type = 'product'
ORDER BY comment_date_gmt DESC
LIMIT 8 " );
if ( $comments ) {
echo '<ul>' ;
foreach ( $comments as $comment ) {
echo '<li>' ;
echo get_avatar ( $comment -> comment_author , '32' );
$rating = get_comment_meta ( $comment -> comment_ID , 'rating' , true );
2013-11-20 19:11:59 +00:00
echo '<div class="star-rating" title="' . esc_attr ( $rating ) . ' " >
2013-07-25 14:00:23 +00:00
< span style = " width:'. ( $rating * 20 ) . '% " > ' . $rating . ' ' . __( ' out of 5 ', ' woocommerce ' ) . ' </ span ></ div > ' ;
2015-02-10 12:51:44 +00:00
echo '<h4 class="meta"><a href="' . get_permalink ( $comment -> ID ) . '#comment-' . absint ( $comment -> comment_ID ) . '">' . esc_html__ ( apply_filters ( 'woocommerce_admin_dashboard_recent_reviews' , $comment -> post_title , $comment ) ) . '</a> ' . __ ( 'reviewed by' , 'woocommerce' ) . ' ' . esc_html ( $comment -> comment_author ) . '</h4>' ;
2013-07-25 14:00:23 +00:00
echo '<blockquote>' . wp_kses_data ( $comment -> comment_excerpt ) . ' [...]</blockquote></li>' ;
}
echo '</ul>' ;
} else {
echo '<p>' . __ ( 'There are no product reviews yet.' , 'woocommerce' ) . '</p>' ;
}
}
}
endif ;
2014-01-11 00:14:27 +00:00
return new WC_Admin_Dashboard ();