Initial commit: WooCommerce Email Discount Manager plugin
This commit is contained in:
@@ -0,0 +1,647 @@
|
||||
<?php
|
||||
/**
|
||||
* Database tables and CRUD.
|
||||
*
|
||||
* @package WC_Email_Discount_Manager
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles custom tables and all CRUD operations.
|
||||
*/
|
||||
class WC_EDM_DB {
|
||||
|
||||
/**
|
||||
* Get a fully prefixed table name.
|
||||
*
|
||||
* @param string $name Short table name (groups, group_categories, emails, shipping_rules).
|
||||
* @return string
|
||||
*/
|
||||
public static function table( $name ) {
|
||||
global $wpdb;
|
||||
return $wpdb->prefix . 'wc_edm_' . $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create/upgrade the custom tables via dbDelta(), then add foreign keys.
|
||||
*/
|
||||
public static function create_tables() {
|
||||
global $wpdb;
|
||||
|
||||
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
|
||||
|
||||
$charset_collate = $wpdb->get_charset_collate();
|
||||
|
||||
$groups = self::table( 'groups' );
|
||||
$group_categories = self::table( 'group_categories' );
|
||||
$emails = self::table( 'emails' );
|
||||
$shipping_rules = self::table( 'shipping_rules' );
|
||||
$audit_log = self::table( 'audit_log' );
|
||||
|
||||
$sql = "CREATE TABLE {$groups} (
|
||||
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||
name varchar(191) NOT NULL,
|
||||
discount_percent decimal(5,2) NOT NULL DEFAULT 0.00,
|
||||
created_at datetime NOT NULL,
|
||||
updated_at datetime NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) {$charset_collate};
|
||||
CREATE TABLE {$group_categories} (
|
||||
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||
group_id bigint(20) unsigned NOT NULL,
|
||||
category_id bigint(20) unsigned NOT NULL,
|
||||
sort_order int(11) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY group_category (group_id,category_id),
|
||||
KEY group_id (group_id)
|
||||
) {$charset_collate};
|
||||
CREATE TABLE {$emails} (
|
||||
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||
email_pattern varchar(191) NOT NULL,
|
||||
assignment_type enum('group','coupon','custom') NOT NULL DEFAULT 'group',
|
||||
group_id bigint(20) unsigned DEFAULT NULL,
|
||||
coupon_code varchar(191) DEFAULT NULL,
|
||||
custom_discount decimal(5,2) DEFAULT NULL,
|
||||
is_active tinyint(1) NOT NULL DEFAULT 1,
|
||||
free_shipping tinyint(1) NOT NULL DEFAULT 0,
|
||||
created_at datetime NOT NULL,
|
||||
updated_at datetime NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY email_pattern (email_pattern),
|
||||
KEY group_id (group_id)
|
||||
) {$charset_collate};
|
||||
CREATE TABLE {$shipping_rules} (
|
||||
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||
group_id bigint(20) unsigned NOT NULL,
|
||||
shipping_method_id varchar(191) NOT NULL,
|
||||
action enum('show','hide') NOT NULL DEFAULT 'show',
|
||||
sort_order int(11) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (id),
|
||||
KEY group_id (group_id)
|
||||
) {$charset_collate};
|
||||
CREATE TABLE {$audit_log} (
|
||||
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||
created_at datetime NOT NULL,
|
||||
user_id bigint(20) unsigned NOT NULL DEFAULT 0,
|
||||
user_login varchar(191) DEFAULT NULL,
|
||||
ip varchar(45) DEFAULT NULL,
|
||||
method varchar(10) NOT NULL DEFAULT '',
|
||||
route varchar(191) NOT NULL DEFAULT '',
|
||||
status smallint(5) unsigned NOT NULL DEFAULT 0,
|
||||
outcome enum('allowed','denied','rate_limited') NOT NULL DEFAULT 'allowed',
|
||||
details text DEFAULT NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY created_at (created_at),
|
||||
KEY user_id (user_id),
|
||||
KEY outcome (outcome)
|
||||
) {$charset_collate};";
|
||||
|
||||
dbDelta( $sql );
|
||||
|
||||
self::add_foreign_keys();
|
||||
|
||||
update_option( 'wc_edm_db_version', WC_EDM_VERSION );
|
||||
}
|
||||
|
||||
/**
|
||||
* Run create_tables() again when the plugin was updated without
|
||||
* re-activation (dbDelta adds any missing columns).
|
||||
*/
|
||||
public static function maybe_upgrade() {
|
||||
if ( get_option( 'wc_edm_db_version' ) !== WC_EDM_VERSION ) {
|
||||
self::create_tables();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add foreign key constraints (dbDelta cannot handle these).
|
||||
*/
|
||||
private static function add_foreign_keys() {
|
||||
$groups = self::table( 'groups' );
|
||||
|
||||
self::maybe_add_foreign_key(
|
||||
self::table( 'group_categories' ),
|
||||
'fk_wc_edm_group_categories_group',
|
||||
"FOREIGN KEY (group_id) REFERENCES {$groups} (id) ON DELETE CASCADE"
|
||||
);
|
||||
|
||||
self::maybe_add_foreign_key(
|
||||
self::table( 'emails' ),
|
||||
'fk_wc_edm_emails_group',
|
||||
"FOREIGN KEY (group_id) REFERENCES {$groups} (id) ON DELETE SET NULL"
|
||||
);
|
||||
|
||||
self::maybe_add_foreign_key(
|
||||
self::table( 'shipping_rules' ),
|
||||
'fk_wc_edm_shipping_rules_group',
|
||||
"FOREIGN KEY (group_id) REFERENCES {$groups} (id) ON DELETE CASCADE"
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a foreign key if it does not already exist.
|
||||
*
|
||||
* @param string $table Table name.
|
||||
* @param string $constraint Constraint name.
|
||||
* @param string $definition FOREIGN KEY definition SQL.
|
||||
*/
|
||||
private static function maybe_add_foreign_key( $table, $constraint, $definition ) {
|
||||
global $wpdb;
|
||||
|
||||
$exists = $wpdb->get_var(
|
||||
$wpdb->prepare(
|
||||
'SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS
|
||||
WHERE CONSTRAINT_SCHEMA = %s AND TABLE_NAME = %s AND CONSTRAINT_NAME = %s AND CONSTRAINT_TYPE = %s',
|
||||
DB_NAME,
|
||||
$table,
|
||||
$constraint,
|
||||
'FOREIGN KEY'
|
||||
)
|
||||
);
|
||||
|
||||
if ( ! $exists ) {
|
||||
// Table/constraint names are internal, not user input.
|
||||
$wpdb->query( "ALTER TABLE {$table} ADD CONSTRAINT {$constraint} {$definition}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Discount groups
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get all discount groups.
|
||||
*
|
||||
* @return array Array of row objects.
|
||||
*/
|
||||
public static function get_groups() {
|
||||
global $wpdb;
|
||||
$table = self::table( 'groups' );
|
||||
return $wpdb->get_results( "SELECT * FROM {$table} ORDER BY name ASC" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
}
|
||||
|
||||
/**
|
||||
* Count discount groups.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function count_groups() {
|
||||
global $wpdb;
|
||||
$table = self::table( 'groups' );
|
||||
return (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the most recently created groups.
|
||||
*
|
||||
* @param int $limit Number of groups.
|
||||
* @return array
|
||||
*/
|
||||
public static function get_recent_groups( $limit = 5 ) {
|
||||
global $wpdb;
|
||||
$table = self::table( 'groups' );
|
||||
return $wpdb->get_results(
|
||||
$wpdb->prepare( "SELECT * FROM {$table} ORDER BY created_at DESC LIMIT %d", $limit ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a single group.
|
||||
*
|
||||
* @param int $id Group ID.
|
||||
* @return object|null
|
||||
*/
|
||||
public static function get_group( $id ) {
|
||||
global $wpdb;
|
||||
$table = self::table( 'groups' );
|
||||
return $wpdb->get_row(
|
||||
$wpdb->prepare( "SELECT * FROM {$table} WHERE id = %d", $id ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert a group.
|
||||
*
|
||||
* @param array $data { name, discount_percent }.
|
||||
* @return int New group ID (0 on failure).
|
||||
*/
|
||||
public static function insert_group( $data ) {
|
||||
global $wpdb;
|
||||
$now = current_time( 'mysql' );
|
||||
|
||||
$wpdb->insert(
|
||||
self::table( 'groups' ),
|
||||
array(
|
||||
'name' => $data['name'],
|
||||
'discount_percent' => $data['discount_percent'],
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now,
|
||||
),
|
||||
array( '%s', '%f', '%s', '%s' )
|
||||
);
|
||||
|
||||
return (int) $wpdb->insert_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a group.
|
||||
*
|
||||
* @param int $id Group ID.
|
||||
* @param array $data { name, discount_percent }.
|
||||
* @return bool
|
||||
*/
|
||||
public static function update_group( $id, $data ) {
|
||||
global $wpdb;
|
||||
|
||||
return false !== $wpdb->update(
|
||||
self::table( 'groups' ),
|
||||
array(
|
||||
'name' => $data['name'],
|
||||
'discount_percent' => $data['discount_percent'],
|
||||
'updated_at' => current_time( 'mysql' ),
|
||||
),
|
||||
array( 'id' => $id ),
|
||||
array( '%s', '%f', '%s' ),
|
||||
array( '%d' )
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a group and its related rows.
|
||||
*
|
||||
* @param int $id Group ID.
|
||||
* @return bool
|
||||
*/
|
||||
public static function delete_group( $id ) {
|
||||
global $wpdb;
|
||||
|
||||
// Manual cleanup in case foreign keys are unsupported (e.g. MyISAM).
|
||||
$wpdb->delete( self::table( 'group_categories' ), array( 'group_id' => $id ), array( '%d' ) );
|
||||
$wpdb->delete( self::table( 'shipping_rules' ), array( 'group_id' => $id ), array( '%d' ) );
|
||||
$wpdb->update( self::table( 'emails' ), array( 'group_id' => null ), array( 'group_id' => $id ), array( '%d' ), array( '%d' ) );
|
||||
|
||||
return false !== $wpdb->delete( self::table( 'groups' ), array( 'id' => $id ), array( '%d' ) );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Group categories (M2M)
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get category IDs for a group, ordered by sort_order.
|
||||
*
|
||||
* @param int $group_id Group ID.
|
||||
* @return int[]
|
||||
*/
|
||||
public static function get_group_category_ids( $group_id ) {
|
||||
global $wpdb;
|
||||
$table = self::table( 'group_categories' );
|
||||
|
||||
return array_map(
|
||||
'intval',
|
||||
$wpdb->get_col(
|
||||
$wpdb->prepare( "SELECT category_id FROM {$table} WHERE group_id = %d ORDER BY sort_order ASC, id ASC", $group_id ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace the categories for a group. Sort order follows array order.
|
||||
*
|
||||
* @param int $group_id Group ID.
|
||||
* @param int[] $category_ids Ordered category IDs.
|
||||
*/
|
||||
public static function set_group_categories( $group_id, $category_ids ) {
|
||||
global $wpdb;
|
||||
|
||||
$wpdb->delete( self::table( 'group_categories' ), array( 'group_id' => $group_id ), array( '%d' ) );
|
||||
|
||||
$category_ids = array_values( array_unique( array_map( 'intval', $category_ids ) ) );
|
||||
|
||||
foreach ( $category_ids as $index => $category_id ) {
|
||||
if ( $category_id <= 0 ) {
|
||||
continue;
|
||||
}
|
||||
$wpdb->insert(
|
||||
self::table( 'group_categories' ),
|
||||
array(
|
||||
'group_id' => $group_id,
|
||||
'category_id' => $category_id,
|
||||
'sort_order' => $index,
|
||||
),
|
||||
array( '%d', '%d', '%d' )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Email assignments
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get all email assignments.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function get_emails() {
|
||||
global $wpdb;
|
||||
$table = self::table( 'emails' );
|
||||
return $wpdb->get_results( "SELECT * FROM {$table} ORDER BY email_pattern ASC" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all active email assignments.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function get_active_emails() {
|
||||
global $wpdb;
|
||||
$table = self::table( 'emails' );
|
||||
return $wpdb->get_results( "SELECT * FROM {$table} WHERE is_active = 1" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
}
|
||||
|
||||
/**
|
||||
* Count email assignments.
|
||||
*
|
||||
* @param bool $active_only Count only active assignments.
|
||||
* @return int
|
||||
*/
|
||||
public static function count_emails( $active_only = false ) {
|
||||
global $wpdb;
|
||||
$table = self::table( 'emails' );
|
||||
$sql = "SELECT COUNT(*) FROM {$table}";
|
||||
if ( $active_only ) {
|
||||
$sql .= ' WHERE is_active = 1';
|
||||
}
|
||||
return (int) $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a single email assignment.
|
||||
*
|
||||
* @param int $id Assignment ID.
|
||||
* @return object|null
|
||||
*/
|
||||
public static function get_email( $id ) {
|
||||
global $wpdb;
|
||||
$table = self::table( 'emails' );
|
||||
return $wpdb->get_row(
|
||||
$wpdb->prepare( "SELECT * FROM {$table} WHERE id = %d", $id ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert an email assignment.
|
||||
*
|
||||
* @param array $data Assignment data.
|
||||
* @return int New ID (0 on failure).
|
||||
*/
|
||||
public static function insert_email( $data ) {
|
||||
global $wpdb;
|
||||
$now = current_time( 'mysql' );
|
||||
|
||||
$wpdb->insert(
|
||||
self::table( 'emails' ),
|
||||
array(
|
||||
'email_pattern' => $data['email_pattern'],
|
||||
'assignment_type' => $data['assignment_type'],
|
||||
'group_id' => $data['group_id'],
|
||||
'coupon_code' => $data['coupon_code'],
|
||||
'custom_discount' => $data['custom_discount'],
|
||||
'is_active' => $data['is_active'],
|
||||
'free_shipping' => $data['free_shipping'],
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now,
|
||||
)
|
||||
);
|
||||
|
||||
return (int) $wpdb->insert_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update an email assignment.
|
||||
*
|
||||
* @param int $id Assignment ID.
|
||||
* @param array $data Assignment data.
|
||||
* @return bool
|
||||
*/
|
||||
public static function update_email( $id, $data ) {
|
||||
global $wpdb;
|
||||
|
||||
return false !== $wpdb->update(
|
||||
self::table( 'emails' ),
|
||||
array(
|
||||
'email_pattern' => $data['email_pattern'],
|
||||
'assignment_type' => $data['assignment_type'],
|
||||
'group_id' => $data['group_id'],
|
||||
'coupon_code' => $data['coupon_code'],
|
||||
'custom_discount' => $data['custom_discount'],
|
||||
'is_active' => $data['is_active'],
|
||||
'free_shipping' => $data['free_shipping'],
|
||||
'updated_at' => current_time( 'mysql' ),
|
||||
),
|
||||
array( 'id' => $id )
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggle an email assignment's active flag.
|
||||
*
|
||||
* @param int $id Assignment ID.
|
||||
* @param int $is_active 1 or 0.
|
||||
* @return bool
|
||||
*/
|
||||
public static function set_email_active( $id, $is_active ) {
|
||||
global $wpdb;
|
||||
|
||||
return false !== $wpdb->update(
|
||||
self::table( 'emails' ),
|
||||
array(
|
||||
'is_active' => $is_active ? 1 : 0,
|
||||
'updated_at' => current_time( 'mysql' ),
|
||||
),
|
||||
array( 'id' => $id ),
|
||||
array( '%d', '%s' ),
|
||||
array( '%d' )
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an email assignment.
|
||||
*
|
||||
* @param int $id Assignment ID.
|
||||
* @return bool
|
||||
*/
|
||||
public static function delete_email( $id ) {
|
||||
global $wpdb;
|
||||
return false !== $wpdb->delete( self::table( 'emails' ), array( 'id' => $id ), array( '%d' ) );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Shipping rules
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get shipping rules for a group, ordered by sort_order.
|
||||
*
|
||||
* @param int $group_id Group ID.
|
||||
* @return array
|
||||
*/
|
||||
public static function get_shipping_rules( $group_id ) {
|
||||
global $wpdb;
|
||||
$table = self::table( 'shipping_rules' );
|
||||
|
||||
return $wpdb->get_results(
|
||||
$wpdb->prepare( "SELECT * FROM {$table} WHERE group_id = %d ORDER BY sort_order ASC, id ASC", $group_id ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace all shipping rules for a group.
|
||||
*
|
||||
* @param int $group_id Group ID.
|
||||
* @param array $rules Array of { shipping_method_id, action, sort_order }.
|
||||
*/
|
||||
public static function replace_shipping_rules( $group_id, $rules ) {
|
||||
global $wpdb;
|
||||
|
||||
$wpdb->delete( self::table( 'shipping_rules' ), array( 'group_id' => $group_id ), array( '%d' ) );
|
||||
|
||||
foreach ( $rules as $rule ) {
|
||||
if ( empty( $rule['shipping_method_id'] ) || ! in_array( $rule['action'], array( 'show', 'hide' ), true ) ) {
|
||||
continue;
|
||||
}
|
||||
$wpdb->insert(
|
||||
self::table( 'shipping_rules' ),
|
||||
array(
|
||||
'group_id' => $group_id,
|
||||
'shipping_method_id' => $rule['shipping_method_id'],
|
||||
'action' => $rule['action'],
|
||||
'sort_order' => (int) $rule['sort_order'],
|
||||
),
|
||||
array( '%d', '%s', '%s', '%d' )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Audit log
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Insert an audit log entry.
|
||||
*
|
||||
* @param array $data Entry data.
|
||||
* @return int New entry ID (0 on failure).
|
||||
*/
|
||||
public static function insert_audit_entry( $data ) {
|
||||
global $wpdb;
|
||||
|
||||
$wpdb->insert(
|
||||
self::table( 'audit_log' ),
|
||||
array(
|
||||
'created_at' => current_time( 'mysql' ),
|
||||
'user_id' => (int) $data['user_id'],
|
||||
'user_login' => $data['user_login'],
|
||||
'ip' => $data['ip'],
|
||||
'method' => $data['method'],
|
||||
'route' => $data['route'],
|
||||
'status' => (int) $data['status'],
|
||||
'outcome' => $data['outcome'],
|
||||
'details' => $data['details'],
|
||||
),
|
||||
array( '%s', '%d', '%s', '%s', '%s', '%s', '%d', '%s', '%s' )
|
||||
);
|
||||
|
||||
return (int) $wpdb->insert_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get audit log entries, newest first.
|
||||
*
|
||||
* @param int $limit Max entries.
|
||||
* @param int $offset Offset.
|
||||
* @param string $outcome Optional outcome filter (allowed/denied/rate_limited).
|
||||
* @return array
|
||||
*/
|
||||
public static function get_audit_entries( $limit = 50, $offset = 0, $outcome = '' ) {
|
||||
global $wpdb;
|
||||
$table = self::table( 'audit_log' );
|
||||
|
||||
if ( in_array( $outcome, array( 'allowed', 'denied', 'rate_limited' ), true ) ) {
|
||||
return $wpdb->get_results(
|
||||
$wpdb->prepare(
|
||||
"SELECT * FROM {$table} WHERE outcome = %s ORDER BY id DESC LIMIT %d OFFSET %d", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
$outcome,
|
||||
$limit,
|
||||
$offset
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return $wpdb->get_results(
|
||||
$wpdb->prepare( "SELECT * FROM {$table} ORDER BY id DESC LIMIT %d OFFSET %d", $limit, $offset ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Count audit log entries.
|
||||
*
|
||||
* @param string $outcome Optional outcome filter.
|
||||
* @return int
|
||||
*/
|
||||
public static function count_audit_entries( $outcome = '' ) {
|
||||
global $wpdb;
|
||||
$table = self::table( 'audit_log' );
|
||||
|
||||
if ( in_array( $outcome, array( 'allowed', 'denied', 'rate_limited' ), true ) ) {
|
||||
return (int) $wpdb->get_var(
|
||||
$wpdb->prepare( "SELECT COUNT(*) FROM {$table} WHERE outcome = %s", $outcome ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
);
|
||||
}
|
||||
|
||||
return (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete audit entries older than the retention period.
|
||||
*
|
||||
* @param int $days Retention in days.
|
||||
* @return int Rows deleted.
|
||||
*/
|
||||
public static function prune_audit_log( $days ) {
|
||||
global $wpdb;
|
||||
$table = self::table( 'audit_log' );
|
||||
|
||||
$cutoff = gmdate( 'Y-m-d H:i:s', strtotime( current_time( 'mysql' ) . ' -' . absint( $days ) . ' days' ) );
|
||||
|
||||
return (int) $wpdb->query(
|
||||
$wpdb->prepare( "DELETE FROM {$table} WHERE created_at < %s", $cutoff ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete every audit log entry.
|
||||
*
|
||||
* @return int Rows deleted.
|
||||
*/
|
||||
public static function clear_audit_log() {
|
||||
global $wpdb;
|
||||
$table = self::table( 'audit_log' );
|
||||
|
||||
return (int) $wpdb->query( "DELETE FROM {$table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user