<?php if (!defined('ABSPATH')) { exit; } if (!class_exists('WP_List_Table')) { require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php'; } class WC_Report_Downloads extends WP_List_Table { protected $max_items; public function __construct() { parent::__construct(array('singular' => 'download', 'plural' => 'downloads', 'ajax' => false)); } public function display_tablenav($position) { if ('top' !== $position) { parent::display_tablenav($position); } } public function output_report() { $this->prepare_items(); if (!empty($_GET['permission_id'])) { $permission_id = absint($_GET['permission_id']); $permission = null; $product = null; try { $permission = new WC_Customer_Download($permission_id); $product = wc_get_product($permission->product_id); } catch (Exception $e) { wp_die(sprintf(esc_html__('Permission #%d not found.', 'woocommerce'), esc_html($permission_id))); } } echo '<h1>' . esc_html__('Customer downloads', 'woocommerce'); $filters = $this->get_filter_vars(); $filter_list = array(); $filter_names = array('product_id' => __('Product', 'woocommerce'), 'download_id' => __('File ID', 'woocommerce'), 'permission_id' => __('Permission ID', 'woocommerce'), 'order_id' => __('Order', 'woocommerce'), 'user_id' => __('User', 'woocommerce'), 'user_ip_address' => __('IP address', 'woocommerce')); foreach ($filters as $key => $value) { if (is_null($value)) { continue; } switch ($key) { case 'order_id': $order = wc_get_order($value); if ($order) { $display_value = _x('#', 'hash before order number', 'woocommerce') . $order->get_order_number(); } else { break 2; } break; case 'product_id': $product = wc_get_product($value); if ($product) { $display_value = $product->get_formatted_name(); } else { break 2; } break; default: $display_value = $value; break; } $filter_list[] = $filter_names[$key] . ' ' . $display_value . ' <a href="' . esc_url(remove_query_arg($key)) . '" class="woocommerce-reports-remove-filter">&times;</a>'; } echo '</h1>'; echo '<div id="active-filters" class="woocommerce-reports-wide"><h2>'; echo esc_html__('Active filters', 'woocommerce') . ': '; echo $filter_list ? wp_kses_post(implode(', ', $filter_list)) : ''; echo '</h2></div>'; echo '<div id="poststuff" class="woocommerce-reports-wide">'; $this->display(); echo '</div>'; } public function column_default($item, $column_name) { $permission = null; $product = null; try { $permission = new WC_Customer_Download($item->permission_id); $product = wc_get_product($permission->product_id); } catch (Exception $e) { return; } switch ($column_name) { case 'timestamp': echo esc_html($item->timestamp); break; case 'product': if (!empty($product)) { edit_post_link(esc_html($product->get_formatted_name()), '', '', $product->get_id(), 'view-link'); echo '<div class="row-actions">'; echo '<a href="' . esc_url(add_query_arg('product_id', $product->get_id())) . '">' . esc_html__('Filter by product', 'woocommerce') . '</a>'; echo '</div>'; } break; case 'file': if (!empty($permission) && !empty($product)) { $file = $product->get_file($permission->get_download_id()); if (false === $file) { echo esc_html__('File does not exist', 'woocommerce'); } else { echo esc_html($file->get_name() . ' - ' . basename($file->get_file())); echo '<div class="row-actions">'; echo '<a href="' . esc_url(add_query_arg('download_id', $permission->get_download_id())) . '">' . esc_html__('Filter by file', 'woocommerce') . '</a>'; echo '</div>'; } } break; case 'order': if (!empty($permission) && ($order = wc_get_order($permission->order_id))) { edit_post_link(esc_html(_x('#', 'hash before order number', 'woocommerce') . $order->get_order_number()), '', '', $permission->order_id, 'view-link'); echo '<div class="row-actions">'; echo '<a href="' . esc_url(add_query_arg('order_id', $order->get_id())) . '">' . esc_html__('Filter by order', 'woocommerce') . '</a>'; echo '</div>'; } break; case 'user': if ($item->user_id > 0) { $user = get_user_by('id', $item->user_id); if (!empty($user)) { echo '<a href="' . esc_url(get_edit_user_link($item->user_id)) . '">' . esc_html($user->display_name) . '</a>'; echo '<div class="row-actions">'; echo '<a href="' . esc_url(add_query_arg('user_id', $item->user_id)) . '">' . esc_html__('Filter by user', 'woocommerce') . '</a>'; echo '</div>'; } } else { esc_html_e('Guest', 'woocommerce'); } break; case 'user_ip_address': echo esc_html($item->user_ip_address); echo '<div class="row-actions">'; echo '<a href="' . esc_url(add_query_arg('user_ip_address', $item->user_ip_address)) . '">' . esc_html__('Filter by IP address', 'woocommerce') . '</a>'; echo '</div>'; break; } } public function get_columns() { $columns = array('timestamp' => __('Timestamp', 'woocommerce'), 'product' => __('Product', 'woocommerce'), 'file' => __('File', 'woocommerce'), 'order' => __('Order', 'woocommerce'), 'user' => __('User', 'woocommerce'), 'user_ip_address' => __('IP address', 'woocommerce')); return $columns; } public function prepare_items() { $this->_column_headers = array($this->get_columns(), array(), $this->get_sortable_columns()); $current_page = absint($this->get_pagenum()); $per_page = max(1, apply_filters('woocommerce_admin_downloads_report_downloads_per_page', 20)); $this->get_items($current_page, $per_page); $this->set_pagination_args(array('total_items' => $this->max_items, 'per_page' => $per_page, 'total_pages' => ceil($this->max_items / $per_page))); } public function no_items() { esc_html_e('No customer downloads found.', 'woocommerce'); } protected function get_filter_vars() { $product_id = !empty($_GET['product_id']) ? absint(wp_unslash($_GET['product_id'])) : null; $download_id = !empty($_GET['download_id']) ? wc_clean(wp_unslash($_GET['download_id'])) : null; $permission_id = !empty($_GET['permission_id']) ? absint(wp_unslash($_GET['permission_id'])) : null; $order_id = !empty($_GET['order_id']) ? absint(wp_unslash($_GET['order_id'])) : null; $user_id = !empty($_GET['user_id']) ? absint(wp_unslash($_GET['user_id'])) : null; $user_ip_address = !empty($_GET['user_ip_address']) ? wc_clean(wp_unslash($_GET['user_ip_address'])) : null; return (object) array('product_id' => $product_id, 'download_id' => $download_id, 'permission_id' => $permission_id, 'order_id' => $order_id, 'user_id' => $user_id, 'user_ip_address' => $user_ip_address); } public function get_items($current_page, $per_page) { global $wpdb; $this->max_items = 0; $this->items = array(); $filters = $this->get_filter_vars(); $table = $wpdb->prefix . WC_Customer_Download_Log_Data_Store::get_table_name(); $query_from = " FROM {$table} as downloads "; if (!is_null($filters->product_id) || !is_null($filters->download_id) || !is_null($filters->order_id)) { $query_from .= " LEFT JOIN {$wpdb->prefix}woocommerce_downloadable_product_permissions as permissions on downloads.permission_id = permissions.permission_id "; } $query_from .= ' WHERE 1=1 '; if (!is_null($filters->product_id)) { $query_from .= $wpdb->prepare(' AND product_id = %d ', $filters->product_id); } if (!is_null($filters->download_id)) { $query_from .= $wpdb->prepare(' AND download_id = %s ', $filters->download_id); } if (!is_null($filters->order_id)) { $query_from .= $wpdb->prepare(' AND order_id = %d ', $filters->order_id); } if (!is_null($filters->permission_id)) { $query_from .= $wpdb->prepare(' AND downloads.permission_id = %d ', $filters->permission_id); } if (!is_null($filters->user_id)) { $query_from .= $wpdb->prepare(' AND downloads.user_id = %d ', $filters->user_id); } if (!is_null($filters->user_ip_address)) { $query_from .= $wpdb->prepare(' AND user_ip_address = %s ', $filters->user_ip_address); } $query_from = apply_filters('woocommerce_report_downloads_query_from', $query_from); $query_order = $wpdb->prepare('ORDER BY timestamp DESC LIMIT %d, %d;', ($current_page - 1) * $per_page, $per_page); $this->items = $wpdb->get_results("SELECT * {$query_from} {$query_order}"); $this->max_items = $wpdb->get_var("SELECT COUNT( DISTINCT download_log_id ) {$query_from};"); } }