151 lines
3.9 KiB
PHP
151 lines
3.9 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Class ActionScheduler_DBLogger
|
|
*
|
|
* Action logs data table data store.
|
|
*
|
|
* @since 3.0.0
|
|
*/
|
|
class ActionScheduler_DBLogger extends ActionScheduler_Logger {
|
|
|
|
/**
|
|
* Add a record to an action log.
|
|
*
|
|
* @param int $action_id Action ID.
|
|
* @param string $message Message to be saved in the log entry.
|
|
* @param DateTime $date Timestamp of the log entry.
|
|
*
|
|
* @return int The log entry ID.
|
|
*/
|
|
public function log( $action_id, $message, DateTime $date = null ) {
|
|
if ( empty( $date ) ) {
|
|
$date = as_get_datetime_object();
|
|
} else {
|
|
$date = clone $date;
|
|
}
|
|
|
|
$date_gmt = $date->format( 'Y-m-d H:i:s' );
|
|
ActionScheduler_TimezoneHelper::set_local_timezone( $date );
|
|
$date_local = $date->format( 'Y-m-d H:i:s' );
|
|
|
|
/** @var \wpdb $wpdb */
|
|
global $wpdb;
|
|
$wpdb->insert( $wpdb->actionscheduler_logs, [
|
|
'action_id' => $action_id,
|
|
'message' => $message,
|
|
'log_date_gmt' => $date_gmt,
|
|
'log_date_local' => $date_local,
|
|
], [ '%d', '%s', '%s', '%s' ] );
|
|
|
|
return $wpdb->insert_id;
|
|
}
|
|
|
|
/**
|
|
* Retrieve an action log entry.
|
|
*
|
|
* @param int $entry_id Log entry ID.
|
|
*
|
|
* @return ActionScheduler_LogEntry
|
|
*/
|
|
public function get_entry( $entry_id ) {
|
|
/** @var \wpdb $wpdb */
|
|
global $wpdb;
|
|
$entry = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->actionscheduler_logs} WHERE log_id=%d", $entry_id ) );
|
|
|
|
return $this->create_entry_from_db_record( $entry );
|
|
}
|
|
|
|
/**
|
|
* Create an action log entry from a database record.
|
|
*
|
|
* @param object $record Log entry database record object.
|
|
*
|
|
* @return ActionScheduler_LogEntry
|
|
*/
|
|
private function create_entry_from_db_record( $record ) {
|
|
if ( empty( $record ) ) {
|
|
return new ActionScheduler_NullLogEntry();
|
|
}
|
|
|
|
if ( is_null( $record->log_date_gmt ) ) {
|
|
$date = as_get_datetime_object( ActionScheduler_StoreSchema::DEFAULT_DATE );
|
|
} else {
|
|
$date = as_get_datetime_object( $record->log_date_gmt );
|
|
}
|
|
|
|
return new ActionScheduler_LogEntry( $record->action_id, $record->message, $date );
|
|
}
|
|
|
|
/**
|
|
* Retrieve the an action's log entries from the database.
|
|
*
|
|
* @param int $action_id Action ID.
|
|
*
|
|
* @return ActionScheduler_LogEntry[]
|
|
*/
|
|
public function get_logs( $action_id ) {
|
|
/** @var \wpdb $wpdb */
|
|
global $wpdb;
|
|
|
|
$records = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->actionscheduler_logs} WHERE action_id=%d", $action_id ) );
|
|
|
|
return array_map( [ $this, 'create_entry_from_db_record' ], $records );
|
|
}
|
|
|
|
/**
|
|
* Initialize the data store.
|
|
*
|
|
* @codeCoverageIgnore
|
|
*/
|
|
public function init() {
|
|
$table_maker = new ActionScheduler_LoggerSchema();
|
|
$table_maker->init();
|
|
$table_maker->register_tables();
|
|
|
|
parent::init();
|
|
|
|
add_action( 'action_scheduler_deleted_action', [ $this, 'clear_deleted_action_logs' ], 10, 1 );
|
|
}
|
|
|
|
/**
|
|
* Delete the action logs for an action.
|
|
*
|
|
* @param int $action_id Action ID.
|
|
*/
|
|
public function clear_deleted_action_logs( $action_id ) {
|
|
/** @var \wpdb $wpdb */
|
|
global $wpdb;
|
|
$wpdb->delete( $wpdb->actionscheduler_logs, [ 'action_id' => $action_id, ], [ '%d' ] );
|
|
}
|
|
|
|
/**
|
|
* Bulk add cancel action log entries.
|
|
*
|
|
* @param array $action_ids List of action ID.
|
|
*/
|
|
public function bulk_log_cancel_actions( $action_ids ) {
|
|
if ( empty( $action_ids ) ) {
|
|
return;
|
|
}
|
|
|
|
/** @var \wpdb $wpdb */
|
|
global $wpdb;
|
|
$date = as_get_datetime_object();
|
|
$date_gmt = $date->format( 'Y-m-d H:i:s' );
|
|
ActionScheduler_TimezoneHelper::set_local_timezone( $date );
|
|
$date_local = $date->format( 'Y-m-d H:i:s' );
|
|
$message = __( 'action canceled', 'woocommerce' );
|
|
$format = '(%d, ' . $wpdb->prepare( '%s, %s, %s', $message, $date_gmt, $date_local ) . ')';
|
|
$sql_query = "INSERT {$wpdb->actionscheduler_logs} (action_id, message, log_date_gmt, log_date_local) VALUES ";
|
|
$value_rows = [];
|
|
|
|
foreach ( $action_ids as $action_id ) {
|
|
$value_rows[] = $wpdb->prepare( $format, $action_id );
|
|
}
|
|
$sql_query .= implode( ',', $value_rows );
|
|
|
|
$wpdb->query( $sql_query );
|
|
}
|
|
}
|