You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
3.6 KiB
PHP

<?php
/**
* The database operations for the 404 Monitor module.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Monitor
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Monitor;
use RankMath\Helper;
use RankMath\Admin\Database\Database;
defined( 'ABSPATH' ) || exit;
/**
* DB class.
*/
class DB {
/**
* Get query builder.
*
* @return Query_Builder
*/
private static function table() {
return Database::table( 'rank_math_404_logs' );
}
/**
* Get error log items.
*
* @param array $args Array of arguments.
*
* @return array
*/
public static function get_logs( $args ) {
$args = wp_parse_args(
$args,
[
'orderby' => 'id',
'order' => 'DESC',
'limit' => 10,
'paged' => 1,
'search' => '',
'ids' => [],
'uri' => '',
]
);
$args = apply_filters( 'rank_math/404_monitor/get_logs_args', $args );
$table = self::table()->found_rows()->page( $args['paged'] - 1, $args['limit'] );
if ( ! empty( $args['search'] ) ) {
$table->whereLike( 'uri', rawurlencode( $args['search'] ) );
}
if ( ! empty( $args['ids'] ) ) {
$table->whereIn( 'id', (array) $args['ids'] );
}
if ( ! empty( $args['uri'] ) ) {
$table->where( 'uri', $args['uri'] );
}
if ( ! empty( $args['orderby'] ) && in_array( $args['orderby'], [ 'id', 'uri', 'accessed', 'times_accessed' ], true ) ) {
$table->orderBy( $args['orderby'], $args['order'] );
}
return [
'logs' => $table->get( ARRAY_A ),
'count' => $table->get_found_rows(),
];
}
/**
* Add a record.
*
* @param array $args Values to insert.
*/
public static function add( $args ) {
$args = wp_parse_args(
$args,
[
'uri' => '',
'accessed' => current_time( 'mysql' ),
'times_accessed' => '1',
'referer' => '',
'user_agent' => '',
]
);
// Maybe delete logs if record exceed defined limit.
$limit = absint( Helper::get_settings( 'general.404_monitor_limit' ) );
if ( $limit && self::get_count() >= $limit ) {
self::clear_logs();
}
return self::table()->insert( $args, [ '%s', '%s', '%d', '%s', '%s', '%s' ] );
}
/**
* Update a record.
*
* @param array $args Values to update.
*/
public static function update( $args ) {
$row = self::table()->where( 'uri', $args['uri'] )->one( ARRAY_A );
if ( $row ) {
return self::update_counter( $row );
}
return self::add( $args );
}
/**
* Delete a record.
*
* @param array $ids Array of IDs to delete.
*
* @return int Number of records deleted.
*/
public static function delete_log( $ids ) {
return self::table()->whereIn( 'id', (array) $ids )->delete();
}
/**
* Get total number of log items (number of rows in the DB table).
*
* @return int
*/
public static function get_count() {
return self::table()->selectCount()->getVar();
}
/**
* Clear logs completely.
*
* @return int
*/
public static function clear_logs() {
return self::table()->truncate();
}
/**
* Get stats for dashboard widget.
*
* @return array
*/
public static function get_stats() {
return self::table()->selectCount( '*', 'total' )->selectSum( 'times_accessed', 'hits' )->one();
}
/**
* Update if URL is matched and hit.
*
* @param object $row Record to update.
*
* @return int|false The number of rows updated, or false on error.
*/
private static function update_counter( $row ) {
$update_data = [
'accessed' => current_time( 'mysql' ),
'times_accessed' => absint( $row['times_accessed'] ) + 1,
];
return self::table()->set( $update_data )->where( 'id', absint( $row['id'] ) )->update();
}
}