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.
286 lines
7.1 KiB
PHP
286 lines
7.1 KiB
PHP
<?php
|
|
/**
|
|
* The WP List Table class 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\Traits\Hooker;
|
|
use RankMath\Redirections\DB as RedirectionsDB;
|
|
use RankMath\Redirections\Cache as RedirectionsCache;
|
|
use RankMath\Admin\List_Table;
|
|
use RankMath\Monitor\Admin;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* Table class.
|
|
*/
|
|
class Table extends List_Table {
|
|
|
|
use Hooker;
|
|
|
|
/**
|
|
* The Constructor.
|
|
*/
|
|
public function __construct() {
|
|
parent::__construct(
|
|
[
|
|
'screen' => Admin::get_screen(),
|
|
'singular' => 'event',
|
|
'plural' => 'events',
|
|
'no_items' => esc_html__( 'The 404 error log is empty.', 'rank-math' ),
|
|
]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Prepares the list of items for displaying.
|
|
*/
|
|
public function prepare_items() {
|
|
global $per_page;
|
|
|
|
$per_page = $this->get_items_per_page( 'rank_math_404_monitor_per_page', 100 );
|
|
$search = $this->get_search();
|
|
|
|
$data = DB::get_logs(
|
|
[
|
|
'limit' => $per_page,
|
|
'order' => $this->get_order(),
|
|
'orderby' => $this->get_orderby( 'accessed' ),
|
|
'paged' => $this->get_pagenum(),
|
|
'search' => $search ? $search : '',
|
|
]
|
|
);
|
|
|
|
$this->items = $data['logs'];
|
|
|
|
foreach ( $this->items as $i => $item ) {
|
|
$this->items[ $i ]['uri_decoded'] = urldecode( $item['uri'] );
|
|
}
|
|
|
|
$this->set_pagination_args(
|
|
[
|
|
'total_items' => $data['count'],
|
|
'per_page' => $per_page,
|
|
]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Extra controls to be displayed between bulk actions and pagination.
|
|
*
|
|
* @param string $which Where to show nav.
|
|
*/
|
|
protected function extra_tablenav( $which ) {
|
|
if ( empty( $this->items ) ) {
|
|
return;
|
|
}
|
|
?>
|
|
<div class="alignleft actions">
|
|
<input type="button" class="button button-link-delete action rank-math-clear-logs" value="<?php esc_attr_e( 'Clear Log', 'rank-math' ); ?>">
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Handles the checkbox column output.
|
|
*
|
|
* @param object $item The current item.
|
|
*/
|
|
public function column_cb( $item ) {
|
|
$out = sprintf( '<input type="checkbox" name="log[]" value="%s" />', $item['id'] );
|
|
return $this->do_filter( '404_monitor/list_table_column', $out, $item, 'cb' );
|
|
}
|
|
|
|
/**
|
|
* Handle the URI column.
|
|
*
|
|
* @param object $item The current item.
|
|
*/
|
|
protected function column_uri( $item ) {
|
|
$link = '<a href="' . esc_url( home_url( $item['uri'] ) ) . '" target="_blank" title="' . esc_attr__( 'View', 'rank-math' ) . '">' . esc_html( $item['uri_decoded'] ) . '</a>';
|
|
$out = $link . $this->column_actions( $item );
|
|
return $this->do_filter( '404_monitor/list_table_column', $out, $item, 'uri' );
|
|
}
|
|
|
|
/**
|
|
* Handle the referer column.
|
|
*
|
|
* @param object $item The current item.
|
|
*/
|
|
protected function column_referer( $item ) {
|
|
$out = '<a href="' . esc_url( $item['referer'] ) . '" target="_blank">' . esc_html( $item['referer'] ) . '</a>';
|
|
return $this->do_filter( '404_monitor/list_table_column', $out, $item, 'referer' );
|
|
}
|
|
|
|
/**
|
|
* Handles the default column output.
|
|
*
|
|
* @param object $item The current item.
|
|
* @param string $column_name The current column name.
|
|
*/
|
|
public function column_default( $item, $column_name ) {
|
|
$out = '';
|
|
if ( in_array( $column_name, [ 'times_accessed', 'accessed', 'user_agent' ], true ) ) {
|
|
$out = esc_html( $item[ $column_name ] );
|
|
}
|
|
|
|
return $this->do_filter( '404_monitor/list_table_column', $out, $item, $column_name );
|
|
}
|
|
|
|
/**
|
|
* Generate row actions div.
|
|
*
|
|
* @param object $item The current item.
|
|
*/
|
|
public function column_actions( $item ) {
|
|
$actions = [];
|
|
|
|
$actions['view'] = sprintf(
|
|
'<a href="%s" target="_blank">' . esc_html__( 'View', 'rank-math' ) . '</a>',
|
|
esc_url( home_url( $item['uri'] ) )
|
|
);
|
|
|
|
if ( Helper::get_module( 'redirections' ) ) {
|
|
$this->add_redirection_actions( $item, $actions );
|
|
}
|
|
|
|
$actions['delete'] = sprintf(
|
|
'<a href="%s" class="rank-math-404-delete">' . esc_html__( 'Delete', 'rank-math' ) . '</a>',
|
|
Helper::get_admin_url(
|
|
'404-monitor',
|
|
[
|
|
'action' => 'delete',
|
|
'log' => $item['id'],
|
|
'security' => wp_create_nonce( '404_delete_log' ),
|
|
]
|
|
)
|
|
);
|
|
|
|
return $this->row_actions( $actions );
|
|
}
|
|
|
|
/**
|
|
* Add redirection actions.
|
|
*
|
|
* @param object $item The current item.
|
|
* @param array $actions Array of actions.
|
|
*/
|
|
private function add_redirection_actions( $item, &$actions ) {
|
|
$redirection = RedirectionsCache::get_by_url( $item['uri_decoded'] );
|
|
|
|
if ( ! $redirection ) {
|
|
$redirection = RedirectionsDB::match_redirections( $item['uri_decoded'] );
|
|
}
|
|
|
|
if ( $redirection ) {
|
|
$redirection_array = (array) $redirection;
|
|
$url = esc_url(
|
|
Helper::get_admin_url(
|
|
'redirections',
|
|
[
|
|
'redirection' => isset( $redirection_array['redirection_id'] ) ? $redirection_array['redirection_id'] : $redirection_array['id'],
|
|
'security' => wp_create_nonce( 'redirection_list_action' ),
|
|
'action' => 'edit',
|
|
]
|
|
)
|
|
);
|
|
|
|
$actions['view_redirection'] = sprintf( '<a href="%s" target="_blank">' . esc_html__( 'View Redirection', 'rank-math' ) . '</a>', $url );
|
|
return;
|
|
}
|
|
|
|
$url = esc_url(
|
|
Helper::get_admin_url(
|
|
'redirections',
|
|
[
|
|
'url' => $item['uri_decoded'],
|
|
]
|
|
)
|
|
);
|
|
|
|
$actions['redirect'] = sprintf(
|
|
'<a href="%1$s" class="rank-math-404-redirect-btn">%2$s</a>',
|
|
$url,
|
|
esc_html__( 'Redirect', 'rank-math' )
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get the list of columns.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_columns() {
|
|
$columns = [
|
|
'cb' => '<input type="checkbox" />',
|
|
'uri' => esc_html__( 'URI', 'rank-math' ),
|
|
'referer' => esc_html__( 'Referer', 'rank-math' ),
|
|
'user_agent' => esc_html__( 'User-Agent', 'rank-math' ),
|
|
'times_accessed' => esc_html__( 'Hits', 'rank-math' ),
|
|
'accessed' => esc_html__( 'Access Time', 'rank-math' ),
|
|
];
|
|
|
|
$columns = $this->filter_columns( $columns );
|
|
return $this->do_filter( '404_monitor/list_table_columns', $columns );
|
|
}
|
|
|
|
/**
|
|
* Filter columns.
|
|
*
|
|
* @param array $columns Original columns.
|
|
*
|
|
* @return array
|
|
*/
|
|
private function filter_columns( $columns ) {
|
|
if ( 'simple' === Helper::get_settings( 'general.404_monitor_mode' ) ) {
|
|
unset( $columns['referer'], $columns['user_agent'] );
|
|
return $columns;
|
|
}
|
|
|
|
unset( $columns['times_accessed'] );
|
|
return $columns;
|
|
}
|
|
|
|
/**
|
|
* Get the list of sortable columns.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_sortable_columns() {
|
|
$sortable = [
|
|
'uri' => [ 'uri', false ],
|
|
'times_accessed' => [ 'times_accessed', false ],
|
|
'accessed' => [ 'accessed', false ],
|
|
];
|
|
|
|
return $this->do_filter( '404_monitor/list_table_sortable_columns', $sortable );
|
|
}
|
|
|
|
/**
|
|
* Get an associative array ( option_name => option_title ) with the list
|
|
* of bulk actions available on this table.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_bulk_actions() {
|
|
$actions = [
|
|
'redirect' => esc_html__( 'Redirect', 'rank-math' ),
|
|
'delete' => esc_html__( 'Delete', 'rank-math' ),
|
|
];
|
|
|
|
if ( ! Helper::get_module( 'redirections' ) ) {
|
|
unset( $actions['redirect'] );
|
|
}
|
|
|
|
return $actions;
|
|
}
|
|
}
|