diff --git a/includes/admin/class-wc-admin-log-table-list.php b/includes/admin/class-wc-admin-log-table-list.php
index 561ac2a355a..5b77aa1c4a2 100644
--- a/includes/admin/class-wc-admin-log-table-list.php
+++ b/includes/admin/class-wc-admin-log-table-list.php
@@ -156,6 +156,20 @@ class WC_Admin_Log_Table_List extends WP_List_Table {
);
}
+ /**
+ * Extra controls to be displayed between bulk actions and pagination.
+ *
+ * @param string $which
+ */
+ protected function extra_tablenav( $which ) {
+ if ( 'top' === $which ) {
+ echo '
';
+ $this->source_dropdown();
+ submit_button( __( 'Filter', 'woocommerce' ), '', 'filter-action', false );
+ echo '
';
+ }
+ }
+
/**
* Get a list of sortable columns.
*
@@ -165,12 +179,57 @@ class WC_Admin_Log_Table_List extends WP_List_Table {
return array(
'timestamp' => array( 'timestamp', true ),
'level' => array( 'level', true ),
- 'source' => array( 'source', true ),
+ 'source' => array( 'source', true ),
);
}
+ /**
+ * Display source dropdown
+ *
+ * @global wpdb $wpdb
+ */
+ protected function source_dropdown() {
+ global $wpdb;
+
+ $sources = $wpdb->get_col( "
+ SELECT DISTINCT source
+ FROM {$wpdb->prefix}woocommerce_log
+ WHERE source != ''
+ ORDER BY source ASC
+ " );
+
+ $source_count = count( $sources );
+
+ if ( !$source_count ) {
+ return;
+ }
+
+ $logger = wc_get_logger();
+ $logger->debug( wc_print_r( $sources, 1 ) ) ;
+
+ $selected_source = isset( $_REQUEST['source'] ) ? $_REQUEST['source'] : '';
+ ?>
+
+
+ get_sortable_columns();
- // Column headers
$this->_column_headers = array( $columns, $hidden, $sortable );
$current_page = $this->get_pagenum();
@@ -190,37 +248,24 @@ class WC_Admin_Log_Table_List extends WP_List_Table {
$offset = 0;
}
- $level_filter = '';
+ $where_conditions = array();
+ $where_values = array();
if ( ! empty( $_REQUEST['level'] ) && WC_Log_Levels::is_valid_level( $_REQUEST['level'] ) ) {
- $level_filter = $wpdb->prepare(
- 'AND level >= %d',
- array( WC_Log_Levels::get_level_severity( $_REQUEST['level'] ) )
- );
+ $where_conditions[] = 'level >= %d';
+ $where_values[] = WC_Log_Levels::get_level_severity( $_REQUEST['level'] );
+ }
+ if ( ! empty( $_REQUEST['source'] ) ) {
+ $where_conditions[] = 'source = %s';
+ $where_values[] = $_REQUEST['source'];
}
- $search = '';
- if ( ! empty( $_REQUEST['s'] ) ) {
- $search = "AND source LIKE '%" . esc_sql( $wpdb->esc_like( wc_clean( $_REQUEST['s'] ) ) ) . "%' ";
- }
-
- if ( ! empty( $_REQUEST['orderby'] ) ) {
- switch ( $_REQUEST['orderby'] ) {
-
- // Intentional cascade, these are valid values.
- case 'timestamp':
- case 'source':
- case 'level':
- $order_by = $_REQUEST['orderby'];
- break;
-
- // Invalid $_REQUEST orderby, use default
- default:
- $order_by = 'log_id';
- break;
- }
+ $valid_orders = array( 'log_id', 'level', 'source', 'timestamp' );
+ if ( ! empty( $_REQUEST['orderby'] ) && in_array( $_REQUEST['orderby'], $valid_orders ) ) {
+ $order_by = $_REQUEST['orderby'];
} else {
$order_by = 'log_id';
}
+ $order_by = esc_sql( $order_by );
if ( ! empty( $_REQUEST['order'] ) && 'asc' === strtolower( $_REQUEST['order'] ) ) {
$order_order = 'ASC';
@@ -228,22 +273,28 @@ class WC_Admin_Log_Table_List extends WP_List_Table {
$order_order = 'DESC';
}
- $this->items = $wpdb->get_results(
- "SELECT log_id, timestamp, level, message, source
- FROM {$wpdb->prefix}woocommerce_log
- WHERE 1 = 1 {$level_filter} {$search}
- ORDER BY {$order_by} {$order_order} " .
- $wpdb->prepare( "LIMIT %d OFFSET %d", $per_page, $offset ),
- ARRAY_A
- );
+ $select = 'SELECT log_id, timestamp, level, message, source';
+ $from = "FROM {$wpdb->prefix}woocommerce_log";
+ $where = ! empty( $where_conditions )
+ ? $wpdb->prepare( 'WHERE 1 = 1 AND ' . implode( ' AND ', $where_conditions ), $where_values )
+ : '';
+ $order = "ORDER BY {$order_by} {$order_order}";
+ $limit_offset = $wpdb->prepare( 'LIMIT %d OFFSET %d', $per_page, $offset );
- $count = $wpdb->get_var( "SELECT COUNT(log_id) FROM {$wpdb->prefix}woocommerce_log WHERE 1 = 1 {$level_filter} {$search};" );
+ $query = "{$select} {$from} {$where} {$order} {$limit_offset}";
+ $query_count = "SELECT COUNT(log_id) {$from} {$where}";
+
+ $logger = wc_get_logger();
+ $logger->debug( wc_print_r( $query, 1 ), array( 'source' => 'wc-logger' ) );
+ $logger->debug( wc_print_r( $query_count, 1 ), array( 'source' => 'wc-logger' ) );
+
+ $this->items = $wpdb->get_results( $query, ARRAY_A );
+ $total_items = $wpdb->get_var( $query_count );
- // Set the pagination
$this->set_pagination_args( array(
- 'total_items' => $count,
+ 'total_items' => $total_items,
'per_page' => $per_page,
- 'total_pages' => ceil( $count / $per_page ),
+ 'total_pages' => ceil( $total_items / $per_page ),
) );
}
}
diff --git a/includes/admin/views/html-admin-page-status-logs-db.php b/includes/admin/views/html-admin-page-status-logs-db.php
index 42d38580d2d..b827ed6e984 100644
--- a/includes/admin/views/html-admin-page-status-logs-db.php
+++ b/includes/admin/views/html-admin-page-status-logs-db.php
@@ -10,7 +10,6 @@ if ( ! defined( 'ABSPATH' ) ) {