*/
namespace RankMath\Search_Console;
use RankMath\Helper;
use MyThemeShop\Admin\List_Table;
use RankMath\Admin\Admin_Helper;
defined( 'ABSPATH' ) || exit;
/**
* Analytics_List class.
*/
class Analytics_List extends List_Table {
/**
* Hold current filters applied.
*
* @var array
*/
private $filters;
/**
* Hold old items.
*
* @var array
*/
private $old_items;
/**
* The Constructor.
*/
public function __construct() {
parent::__construct(
[
'singular' => esc_html__( 'analytic', 'rank-math' ),
'plural' => esc_html__( 'analytics', 'rank-math' ),
'no_items' => esc_html__( 'No data.', 'rank-math' ),
]
);
$this->filters = Helper::search_console()->get_filters();
}
/**
* Prepares the list of items for displaying.
*/
public function prepare_items() {
global $per_page;
$per_page = $this->get_items_per_page( 'rank_math_sc_analytics_per_page', 30 );
$this->set_column_headers();
$data = DB::get_data(
array_merge(
$this->filters,
[
'orderby' => $this->get_orderby( 'clicks' ),
'order' => $this->get_order(),
'limit' => $per_page,
'paged' => $this->get_pagenum(),
'search' => $this->get_search() ? $this->get_search() : '',
]
)
);
$this->items = $data['rows'];
$this->old_items = $data['old_rows'];
$this->set_pagination_args(
[
'total_items' => $data['count'],
'per_page' => $per_page,
]
);
unset( $data );
}
/**
* Handle the property column.
*
* @param object $item The current item.
*/
protected function column_property( $item ) {
return 'query' === $this->filters['dimension'] ? $item['property'] :
'' . $item['property'] . '';
}
/**
* 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 ) {
if ( in_array( $column_name, [ 'clicks', 'impressions', 'ctr', 'position' ], true ) ) {
$current = in_array( $column_name, [ 'ctr', 'position' ], true ) ? round( $item[ $column_name ], 2 ) : $item[ $column_name ];
$inverted = 'position' === $column_name ? true : false;
$percentage = 'ctr' === $column_name ? true : false;
return isset( $this->old_items[ $item['property'] ] ) ? self::diff_label( $current, $this->old_items[ $item['property'] ][ $column_name ], $inverted, $percentage ) : $current;
}
return print_r( $item, true );
}
/**
* Get a list of columns.
*
* @return array
*/
public function get_columns() {
return [
'property' => 'query' === $this->filters['dimension'] ? esc_html__( 'Keywords', 'rank-math' ) : esc_html__( 'Pages', 'rank-math' ),
'clicks' => esc_html__( 'Clicks', 'rank-math' ),
'impressions' => esc_html__( 'Impressions', 'rank-math' ),
'ctr' => esc_html__( 'CTR', 'rank-math' ),
'position' => esc_html__( 'Position', 'rank-math' ),
];
}
/**
* Get a list of sortable columns.
*
* @return array
*/
public function get_sortable_columns() {
return [
'property' => [ 'property', false ],
'clicks' => [ 'clicks', false ],
'impressions' => [ 'impressions', false ],
'ctr' => [ 'ctr', false ],
'position' => [ 'position', false ],
];
}
/**
* Create difference label for display.
*
* @param integer $current Current value.
* @param integer $previous Previous value to compare with.
* @param boolean $inverted Invert the result.
* @param boolean $percentage Show as percentage.
*
* @return string
*/
public static function diff_label( $current, $previous = 0, $inverted = false, $percentage = false ) {
$diff = Admin_Helper::compare_values( $previous, $current );
if ( 0 === $diff ) {
return '' . $current . '';
}
$downward = $inverted ? 'up' : 'down';
$upward = $inverted ? 'down' : 'up';
$class = $diff < 0 ? $downward : $upward;
return sprintf(
' %3$s %4$s%5$s',
$class,
/* translators: previous value */
esc_attr( sprintf( esc_html__( 'Previously: %s', 'rank-math' ), $previous ) ),
$current,
$inverted ? abs( $diff ) : ( $diff < 0 ? $diff : '+' . $diff ),
( $percentage ? '%' : '' )
);
}
}