Commit realizado el 12:13:52 08-04-2024

This commit is contained in:
Pagina Web Monito
2024-04-08 12:13:55 -04:00
commit 0c33094de9
7815 changed files with 1365694 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
/*!
* Plugin: Rank Math SEO Pro
* URL: https://rankmath.com/wordpress/plugin/seo-suite/
* Name: 404-monitor.css
*/.rank-math-export-404-panel h3{margin-top:0}.rank-math-export-404-panel form .form-field{display:inline-block;margin-bottom:0}.rank-math-export-404-panel form .form-field input[type="submit"]{vertical-align:baseline}.ui-datepicker{padding:0;margin:0;border-radius:0;background-color:#fff;border:1px solid #dfdfdf;border-top:none;box-shadow:0 3px 6px rgba(0,0,0,0.075);min-width:17em;width:auto}.ui-datepicker *{padding:0;font-family:"Open Sans", sans-serif;border-radius:0}.ui-datepicker table{font-size:13px;margin:0;border:none;border-collapse:collapse}.ui-datepicker .ui-widget-header,.ui-datepicker .ui-datepicker-header{background-image:none;border:none;color:#fff;font-weight:normal}.ui-datepicker .ui-datepicker-header .ui-state-hover{background:transparent;border-color:transparent;cursor:pointer}.ui-datepicker .ui-datepicker-title{margin:0;padding:10px 0;color:#fff;font-size:14px;line-height:14px;text-align:center}.ui-datepicker .ui-datepicker-title select{margin-top:-8px;margin-bottom:-8px}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:relative;top:0;height:34px;width:34px}.ui-datepicker .ui-state-hover.ui-datepicker-prev,.ui-datepicker .ui-state-hover.ui-datepicker-next{border:none}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-prev-hover{left:0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-next-hover{right:0}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:none}.ui-datepicker .ui-datepicker-prev{float:left}.ui-datepicker .ui-datepicker-next{float:right}.ui-datepicker .ui-datepicker-prev:before,.ui-datepicker .ui-datepicker-next:before{font:normal 20px/34px 'dashicons';padding-left:7px;color:#fff;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:34px;height:34px}.ui-datepicker .ui-datepicker-prev:before{content:'\f341'}.ui-datepicker .ui-datepicker-next:before{content:'\f345'}.ui-datepicker .ui-datepicker-prev-hover:before,.ui-datepicker .ui-datepicker-next-hover:before{opacity:0.7}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:33%;background:transparent;border-color:transparent;box-shadow:none;color:#fff}.ui-datepicker select.ui-datepicker-month option,.ui-datepicker select.ui-datepicker-year option{color:#333}.ui-datepicker thead{color:#fff;font-weight:600}.ui-datepicker thead th{font-weight:normal}.ui-datepicker th{padding:10px}.ui-datepicker td{padding:0;border:1px solid #f4f4f4}.ui-datepicker td.ui-datepicker-other-month{border:transparent}.ui-datepicker td.ui-datepicker-week-end{background-color:#f4f4f4;border:1px solid #f4f4f4}.ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today{box-shadow:inset 0px 0px 1px 0px rgba(0,0,0,0.1)}.ui-datepicker td.ui-datepicker-today{background-color:#f0f0c0}.ui-datepicker td.ui-datepicker-current-day{background:#bbdd88}.ui-datepicker td .ui-state-default{background:transparent;border:none;text-align:center;text-decoration:none;width:auto;display:block;padding:5px 10px;font-weight:normal;color:#444}.ui-datepicker td.ui-state-disabled .ui-state-default{opacity:0.5}.ui-datepicker .ui-widget-header,.ui-datepicker .ui-datepicker-header{background:#00a0d2}.ui-datepicker thead{background:#32373c}.ui-datepicker td .ui-state-hover,.ui-datepicker td .ui-state-active{background:#0073aa;color:#fff}.ui-datepicker .ui-timepicker-div{font-size:14px}.ui-datepicker .ui-timepicker-div dl{text-align:left;padding:0 .6em}.ui-datepicker .ui-timepicker-div dl dt{float:left;clear:left;padding:0 0 0 5px}.ui-datepicker .ui-timepicker-div dl dd{margin:0 10px 10px 40%}.ui-datepicker .ui-timepicker-div dl dd select{width:100%}.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane{padding:.6em;text-align:left}.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-primary,.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-secondary{padding:0 10px 1px;border-radius:3px;margin:0 .6em .4em .4em}

View File

@@ -0,0 +1 @@
(()=>{"use strict";var e={n:t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},d:(t,r)=>{for(var a in r)e.o(r,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:r[a]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=jQuery;var r=e.n(t);r()((function(){r()("#rank_math_export_404_date_from, #rank_math_export_404_date_to").datepicker({dateFormat:"yy-mm-dd"});var e=r()(".rank-math-export-404-panel");r()("a.rank-math-404-monitor-export").on("click",(function(t){t.preventDefault(),e.toggleClass("hidden")}))}))})();

View File

@@ -0,0 +1,258 @@
<?php
/**
* 404 Monitor module.
*
* @since 1.0
* @package RankMathPro
* @subpackage RankMathPro\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMathPro;
use RankMath\Helper;
use RankMath\Traits\Hooker;
use MyThemeShop\Helpers\Param;
use MyThemeShop\Database\Database;
use RankMathPro\Admin\CSV;
defined( 'ABSPATH' ) || exit;
/**
* Monitor class.
*
* @codeCoverageIgnore
*/
class Monitor_Pro extends CSV {
use Hooker;
/**
* Total hits cache.
*
* @var array
*/
private $total_hits_cache = [];
/**
* Constructor.
*/
public function __construct() {
$this->filter( 'rank_math/404_monitor/page_title_actions', 'page_title_actions', 20, 1 );
$this->action( 'rank_math/404_monitor/before_list_table', 'export_panel', 20 );
$this->action( 'admin_enqueue_scripts', 'enqueue', 20 );
$this->action( 'init', 'maybe_export', 20 );
$this->filter( 'rank_math/404_monitor/list_table_columns', 'manage_columns', 20 );
$this->filter( 'rank_math/404_monitor/list_table_column', 'total_hits_column', 20, 3 );
$this->filter( 'rank_math/404_monitor/get_logs_args', 'get_logs_args', 20 );
}
/**
* Add page title action for export.
*
* @param array $actions Original actions.
* @return array
*/
public function page_title_actions( $actions ) {
$actions['export'] = [
'class' => 'page-title-action',
'href' => add_query_arg( 'export-404', '1' ),
'label' => __( 'Export', 'rank-math-pro' ),
];
return $actions;
}
/**
* Output export panel.
*
* @return void
*/
public function export_panel() {
$today = date( 'Y-m-d' );
?>
<div class="rank-math-box rank-math-export-404-panel <?php echo Param::get( 'export-404' ) ? '' : 'hidden'; ?>">
<h3><?php esc_html_e( 'Export 404 Logs', 'rank-math-pro' ); ?></h3>
<p class="description">
<?php esc_html_e( 'Export and download 404 logs from a selected period of time in the form of a CSV file. Leave the from/to fields empty to export all logs.', 'rank-math-pro' ); ?>
</p>
<div class="form-wrap">
<form action="" method="get" autocomplete="off">
<input type="hidden" name="action" value="rank_math_export_404">
<?php wp_nonce_field( 'export_404' ); ?>
<div class="form-field">
<label for="rank_math_export_404_date_from">
<?php esc_html_e( 'From date', 'rank-math-pro' ); ?>
</label>
<input type="text" name="date_from" value="" id="rank_math_export_404_date_from" class="rank-math-datepicker" placeholder="<?php echo esc_attr( $today ); ?>">
</div>
<div class="form-field">
<label for="rank_math_export_404_date_to">
<?php esc_html_e( 'To date', 'rank-math-pro' ); ?>
</label>
<input type="text" name="date_to" value="" id="rank_math_export_404_date_to" class="rank-math-datepicker" placeholder="<?php echo esc_attr( $today ); ?>">
</div>
<div class="rank_math_export_404_submit_wrap form-field">
<input type="submit" value="<?php esc_attr_e( 'Export', 'rank-math-pro' ); ?>" class="button button-primary">
</div>
</form>
</div>
</div>
<?php
}
/**
* Undocumented function
*
* @return void
*/
public function maybe_export() {
if ( Param::get( 'action' ) !== 'rank_math_export_404' ) {
return;
}
if ( ! current_user_can( 'export' ) || ! Helper::has_cap( '404_monitor' ) ) {
// Todo: add error notice instead of wp_die()?
wp_die( esc_html__( 'Sorry, your user does not seem to have the necessary capabilities to export.', 'rank-math-pro' ) );
}
if ( wp_verify_nonce( Param::get( '_nonce' ), 'export_404' ) ) {
// Todo: add error notice instead of wp_die()?
wp_die( esc_html__( 'Nonce error. Please try again.', 'rank-math-pro' ) );
}
$date_from = $this->sanitize_datetime( Param::get( 'date_from' ) );
$date_to = $this->sanitize_datetime( Param::get( 'date_to' ) );
$data = $this->export_items( $date_from, $date_to );
$this->export(
[
'filename' => '404-log',
'columns' => $data['columns'],
'items' => $data['items'],
]
);
die();
}
/**
* Do export.
*
* @param string $time_from Start date (SQL DateTime format).
* @param string $time_to End date (SQL DateTime format).
*
* @return array
*/
private function export_items( $time_from = null, $time_to = null ) {
global $wpdb;
$logs_table = $wpdb->prefix . 'rank_math_404_logs';
$query = "SELECT * FROM {$logs_table} WHERE 1=1";
$where = '';
if ( $time_from ) {
$where .= " AND accessed > '{$time_from} 00:00:01'";
}
if ( $time_to ) {
$where .= " AND accessed < '{$time_to} 23:59:59'";
}
$query .= $where;
$items = $wpdb->get_results( $query, ARRAY_A ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
if ( empty( $items ) ) {
return [
'columns' => [],
'items' => [],
];
}
$columns = array_keys( $items[0] );
return [
'columns' => $columns,
'items' => $items,
];
}
/**
* Sanitize date field inputs.
*
* @param string $date Date input.
* @return string
*/
public function sanitize_datetime( $date ) {
return preg_replace( '/[^0-9 :-]/', '', $date );
}
/**
* Enqueue styles and scripts.
*
* @param string $hook The current admin page.
*
* @return void
*/
public function enqueue( $hook ) {
if ( 'rank-math_page_rank-math-404-monitor' !== $hook ) {
return;
}
$url = RANK_MATH_PRO_URL . 'includes/modules/404-monitor/assets/';
wp_enqueue_script( 'rank-math-pro-404-monitor', $url . 'js/404-monitor.js', [ 'jquery-ui-core', 'jquery-ui-datepicker' ], RANK_MATH_PRO_VERSION, true );
wp_enqueue_style( 'rank-math-pro-404-monitor', $url . 'css/404-monitor.css', [], RANK_MATH_PRO_VERSION );
}
/**
* Add extra columns for the list table.
*
* @param array $columns Original columns.
* @return array
*/
public function manage_columns( $columns ) {
if ( 'simple' === Helper::get_settings( 'general.404_monitor_mode' ) ) {
return $columns;
}
$columns['total_hits'] = esc_html__( 'Hits', 'rank-math-pro' );
return $columns;
}
/**
* Add content in the extra columns.
*
* @param string $content Original content.
* @param array $item Table item.
* @param string $column Column name.
* @return string
*/
public function total_hits_column( $content, $item, $column ) {
if ( 'total_hits' !== $column ) {
return $content;
}
if ( ! isset( $this->total_hits_cache[ $item['uri'] ] ) ) {
$this->total_hits_cache[ $item['uri'] ] = Database::table( 'rank_math_404_logs' )->selectCount( '*', 'count' )->where( 'uri', $item['uri'] )->getVar();
}
return '<a href="' . add_query_arg( [ 'uri' => $item['uri'] ], '?page=rank-math-404-monitor' ) . '">' . $this->total_hits_cache[ $item['uri'] ] . '</a>';
}
/**
* Change get_logs() args when filtering for a URI.
*
* @param array $args Original args.
* @return array
*/
public function get_logs_args( $args ) {
$uri = Param::get( 'uri' );
if ( ! $uri ) {
return $args;
}
$args['uri'] = $uri;
return $args;
}
}