Rework db log table
Change tag from text search to select list. Flatten and clean up query logic. Add required methods for source <select>.
This commit is contained in:
parent
c633b07f73
commit
269addd9f8
|
@ -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 '<div class="alignleft actions">';
|
||||||
|
$this->source_dropdown();
|
||||||
|
submit_button( __( 'Filter', 'woocommerce' ), '', 'filter-action', false );
|
||||||
|
echo '</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of sortable columns.
|
* Get a list of sortable columns.
|
||||||
*
|
*
|
||||||
|
@ -169,8 +183,53 @@ class WC_Admin_Log_Table_List extends WP_List_Table {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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'] : '';
|
||||||
|
?>
|
||||||
|
<label for="filter-by-source" class="screen-reader-text"><?php _e( 'Filter by source', 'woocommerce' ); ?></label>
|
||||||
|
<select name="source" id="filter-by-source">
|
||||||
|
<option<?php selected( $selected_source, '' ); ?> value=""><?php _e( 'All', 'woocommerce' ); ?></option>
|
||||||
|
<?php
|
||||||
|
foreach ( $sources as $s ) {
|
||||||
|
$logger->debug($s);
|
||||||
|
printf( '<option%1$s value="%2$s">%3$s</option>',
|
||||||
|
selected( $selected_source, $s, false ),
|
||||||
|
esc_attr( $s ),
|
||||||
|
esc_html( $s )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</select>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepare table list items.
|
* Prepare table list items.
|
||||||
|
*
|
||||||
|
* @global wpdb $wpdb
|
||||||
*/
|
*/
|
||||||
public function prepare_items() {
|
public function prepare_items() {
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
|
@ -180,7 +239,6 @@ class WC_Admin_Log_Table_List extends WP_List_Table {
|
||||||
$hidden = array();
|
$hidden = array();
|
||||||
$sortable = $this->get_sortable_columns();
|
$sortable = $this->get_sortable_columns();
|
||||||
|
|
||||||
// Column headers
|
|
||||||
$this->_column_headers = array( $columns, $hidden, $sortable );
|
$this->_column_headers = array( $columns, $hidden, $sortable );
|
||||||
|
|
||||||
$current_page = $this->get_pagenum();
|
$current_page = $this->get_pagenum();
|
||||||
|
@ -190,37 +248,24 @@ class WC_Admin_Log_Table_List extends WP_List_Table {
|
||||||
$offset = 0;
|
$offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
$level_filter = '';
|
$where_conditions = array();
|
||||||
|
$where_values = array();
|
||||||
if ( ! empty( $_REQUEST['level'] ) && WC_Log_Levels::is_valid_level( $_REQUEST['level'] ) ) {
|
if ( ! empty( $_REQUEST['level'] ) && WC_Log_Levels::is_valid_level( $_REQUEST['level'] ) ) {
|
||||||
$level_filter = $wpdb->prepare(
|
$where_conditions[] = 'level >= %d';
|
||||||
'AND level >= %d',
|
$where_values[] = WC_Log_Levels::get_level_severity( $_REQUEST['level'] );
|
||||||
array( WC_Log_Levels::get_level_severity( $_REQUEST['level'] ) )
|
}
|
||||||
);
|
if ( ! empty( $_REQUEST['source'] ) ) {
|
||||||
|
$where_conditions[] = 'source = %s';
|
||||||
|
$where_values[] = $_REQUEST['source'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$search = '';
|
$valid_orders = array( 'log_id', 'level', 'source', 'timestamp' );
|
||||||
if ( ! empty( $_REQUEST['s'] ) ) {
|
if ( ! empty( $_REQUEST['orderby'] ) && in_array( $_REQUEST['orderby'], $valid_orders ) ) {
|
||||||
$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'];
|
$order_by = $_REQUEST['orderby'];
|
||||||
break;
|
|
||||||
|
|
||||||
// Invalid $_REQUEST orderby, use default
|
|
||||||
default:
|
|
||||||
$order_by = 'log_id';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
$order_by = 'log_id';
|
$order_by = 'log_id';
|
||||||
}
|
}
|
||||||
|
$order_by = esc_sql( $order_by );
|
||||||
|
|
||||||
if ( ! empty( $_REQUEST['order'] ) && 'asc' === strtolower( $_REQUEST['order'] ) ) {
|
if ( ! empty( $_REQUEST['order'] ) && 'asc' === strtolower( $_REQUEST['order'] ) ) {
|
||||||
$order_order = 'ASC';
|
$order_order = 'ASC';
|
||||||
|
@ -228,22 +273,28 @@ class WC_Admin_Log_Table_List extends WP_List_Table {
|
||||||
$order_order = 'DESC';
|
$order_order = 'DESC';
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->items = $wpdb->get_results(
|
$select = 'SELECT log_id, timestamp, level, message, source';
|
||||||
"SELECT log_id, timestamp, level, message, source
|
$from = "FROM {$wpdb->prefix}woocommerce_log";
|
||||||
FROM {$wpdb->prefix}woocommerce_log
|
$where = ! empty( $where_conditions )
|
||||||
WHERE 1 = 1 {$level_filter} {$search}
|
? $wpdb->prepare( 'WHERE 1 = 1 AND ' . implode( ' AND ', $where_conditions ), $where_values )
|
||||||
ORDER BY {$order_by} {$order_order} " .
|
: '';
|
||||||
$wpdb->prepare( "LIMIT %d OFFSET %d", $per_page, $offset ),
|
$order = "ORDER BY {$order_by} {$order_order}";
|
||||||
ARRAY_A
|
$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(
|
$this->set_pagination_args( array(
|
||||||
'total_items' => $count,
|
'total_items' => $total_items,
|
||||||
'per_page' => $per_page,
|
'per_page' => $per_page,
|
||||||
'total_pages' => ceil( $count / $per_page ),
|
'total_pages' => ceil( $total_items / $per_page ),
|
||||||
) );
|
) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,6 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||||
<form method="get" id="mainform" action="">
|
<form method="get" id="mainform" action="">
|
||||||
|
|
||||||
<?php $log_table_list->views(); ?>
|
<?php $log_table_list->views(); ?>
|
||||||
<?php $log_table_list->search_box( __( 'Search tag', 'woocommerce' ), 'tag' ); ?>
|
|
||||||
<?php $log_table_list->display(); ?>
|
<?php $log_table_list->display(); ?>
|
||||||
|
|
||||||
<input type="hidden" name="page" value="wc-status" />
|
<input type="hidden" name="page" value="wc-status" />
|
||||||
|
|
Loading…
Reference in New Issue