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.
269 lines
6.8 KiB
PHTML
269 lines
6.8 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* The Global functionality of the plugin.
|
||
|
*
|
||
|
* Defines the functionality loaded on admin.
|
||
|
*
|
||
|
* @since 1.0.49
|
||
|
* @package RankMath
|
||
|
* @subpackage RankMath\Rest
|
||
|
* @author Rank Math <support@rankmath.com>
|
||
|
*/
|
||
|
|
||
|
namespace RankMath\Analytics;
|
||
|
|
||
|
use WP_Error;
|
||
|
use WP_REST_Server;
|
||
|
use WP_REST_Request;
|
||
|
use WP_REST_Controller;
|
||
|
use RankMath\Helper;
|
||
|
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* Rest class.
|
||
|
*/
|
||
|
class Rest extends WP_REST_Controller {
|
||
|
|
||
|
/**
|
||
|
* Constructor.
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
$this->namespace = \RankMath\Rest\Rest_Helper::BASE . '/an';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Registers the routes for the objects of the controller.
|
||
|
*/
|
||
|
public function register_routes() {
|
||
|
$routes = [
|
||
|
'dashboard' => [
|
||
|
'callback' => [ $this, 'get_dashboard' ],
|
||
|
],
|
||
|
'keywordsOverview' => [
|
||
|
'callback' => [ $this, 'get_keywords_overview' ],
|
||
|
],
|
||
|
'postsSummary' => [
|
||
|
'callback' => [ Stats::get(), 'get_posts_summary' ],
|
||
|
],
|
||
|
'postsRowsByObjects' => [
|
||
|
'callback' => [ Stats::get(), 'get_posts_rows_by_objects' ],
|
||
|
],
|
||
|
'post/(?P<id>\d+)' => [
|
||
|
'callback' => [ $this, 'get_post' ],
|
||
|
],
|
||
|
'keywordsSummary' => [
|
||
|
'callback' => [ Stats::get(), 'get_analytics_summary' ],
|
||
|
],
|
||
|
'analyticsSummary' => [
|
||
|
'callback' => [ $this, 'get_analytics_summary' ],
|
||
|
],
|
||
|
'keywordsRows' => [
|
||
|
'callback' => [ Stats::get(), 'get_keywords_rows' ],
|
||
|
],
|
||
|
'userPreferences' => [
|
||
|
'callback' => [ $this, 'update_user_preferences' ],
|
||
|
'methods' => WP_REST_Server::CREATABLE,
|
||
|
],
|
||
|
'inspectionResults' => [
|
||
|
'callback' => [ $this, 'get_inspection_results' ],
|
||
|
],
|
||
|
'removeFrontendStats' => [
|
||
|
'callback' => [ $this, 'remove_frontend_stats' ],
|
||
|
'methods' => WP_REST_Server::CREATABLE,
|
||
|
],
|
||
|
];
|
||
|
|
||
|
foreach ( $routes as $route => $args ) {
|
||
|
$this->register_route( $route, $args );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register a route.
|
||
|
*
|
||
|
* @param string $route Route.
|
||
|
* @param array $args Arguments.
|
||
|
*/
|
||
|
private function register_route( $route, $args ) {
|
||
|
$route_defaults = [
|
||
|
'methods' => WP_REST_Server::READABLE,
|
||
|
'permission_callback' => [ $this, 'has_permission' ],
|
||
|
];
|
||
|
|
||
|
$route_args = wp_parse_args( $args, $route_defaults );
|
||
|
|
||
|
register_rest_route( $this->namespace, '/' . $route, $route_args );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Determines if the current user can manage analytics.
|
||
|
*
|
||
|
* @return true
|
||
|
*/
|
||
|
public function has_permission() {
|
||
|
return current_user_can( 'rank_math_analytics' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Update user perferences.
|
||
|
*
|
||
|
* @param WP_REST_Request $request Full details about the request.
|
||
|
*
|
||
|
* @return boolean|WP_Error True on success, or WP_Error object on failure.
|
||
|
*/
|
||
|
public function update_user_preferences( WP_REST_Request $request ) {
|
||
|
$pref = $request->get_param( 'preferences' );
|
||
|
if ( empty( $pref ) ) {
|
||
|
return new WP_Error(
|
||
|
'param_value_empty',
|
||
|
esc_html__( 'Sorry, no preference found.', 'rank-math' )
|
||
|
);
|
||
|
}
|
||
|
|
||
|
update_user_meta(
|
||
|
get_current_user_id(),
|
||
|
'rank_math_analytics_table_columns',
|
||
|
$pref
|
||
|
);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get post data.
|
||
|
*
|
||
|
* @param WP_REST_Request $request Full details about the request.
|
||
|
*
|
||
|
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
|
||
|
*/
|
||
|
public function get_post( WP_REST_Request $request ) {
|
||
|
$id = $request->get_param( 'id' );
|
||
|
if ( empty( $id ) ) {
|
||
|
return new WP_Error(
|
||
|
'param_value_empty',
|
||
|
esc_html__( 'Sorry, no post id found.', 'rank-math' )
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return rest_ensure_response( Stats::get()->get_post( $request ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get dashboard data.
|
||
|
*
|
||
|
* @param WP_REST_Request $request Full details about the request.
|
||
|
*
|
||
|
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
|
||
|
*/
|
||
|
public function get_dashboard( WP_REST_Request $request ) { // phpcs:ignore
|
||
|
return rest_ensure_response(
|
||
|
[
|
||
|
'stats' => Stats::get()->get_analytics_summary(),
|
||
|
'optimization' => Stats::get()->get_optimization_summary(),
|
||
|
]
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get analytics summary.
|
||
|
*
|
||
|
* @param WP_REST_Request $request Full details about the request.
|
||
|
*
|
||
|
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
|
||
|
*/
|
||
|
public function get_analytics_summary( WP_REST_Request $request ) { // phpcs:ignore
|
||
|
$post_type = sanitize_key( $request->get_param( 'postType' ) );
|
||
|
return rest_ensure_response(
|
||
|
[
|
||
|
'summary' => Stats::get()->get_posts_summary( $post_type ),
|
||
|
'optimization' => Stats::get()->get_optimization_summary( $post_type ),
|
||
|
]
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get keywords overview.
|
||
|
*
|
||
|
* @param WP_REST_Request $request Full details about the request.
|
||
|
*
|
||
|
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
|
||
|
*/
|
||
|
public function get_keywords_overview( WP_REST_Request $request ) { // phpcs:ignore
|
||
|
return rest_ensure_response(
|
||
|
apply_filters(
|
||
|
'rank_math/analytics/keywords_overview',
|
||
|
[
|
||
|
'topKeywords' => Stats::get()->get_top_keywords(),
|
||
|
'positionGraph' => Stats::get()->get_top_position_graph(),
|
||
|
]
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get inspection results: latest result for each post.
|
||
|
*
|
||
|
* @param WP_REST_Request $request Rest request.
|
||
|
*
|
||
|
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
|
||
|
*/
|
||
|
public function get_inspection_results( WP_REST_Request $request ) {
|
||
|
$per_page = 25;
|
||
|
$rows = Url_Inspection::get()->get_inspections( $request->get_params(), $per_page );
|
||
|
|
||
|
if ( empty( $rows ) ) {
|
||
|
return [
|
||
|
'rows' => [ 'response' => 'No Data' ],
|
||
|
'rowsFound' => 0,
|
||
|
];
|
||
|
}
|
||
|
|
||
|
return rest_ensure_response(
|
||
|
[
|
||
|
'rows' => $rows,
|
||
|
'rowsFound' => DB::get_inspections_count( $request->get_params() ),
|
||
|
]
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Remove frontend stats.
|
||
|
*
|
||
|
* @param WP_REST_Request $request Rest request.
|
||
|
*
|
||
|
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
|
||
|
*/
|
||
|
public function remove_frontend_stats( WP_REST_Request $request ) {
|
||
|
if ( (bool) $request->get_param( 'toggleBar' ) ) {
|
||
|
$hide_bar = (bool) $request->get_param( 'hide' );
|
||
|
$user_id = get_current_user_id();
|
||
|
if ( $hide_bar ) {
|
||
|
return update_user_meta( $user_id, 'rank_math_hide_frontend_stats', true );
|
||
|
}
|
||
|
|
||
|
return delete_user_meta( $user_id, 'rank_math_hide_frontend_stats' );
|
||
|
}
|
||
|
|
||
|
$all_opts = rank_math()->settings->all_raw();
|
||
|
$general = $all_opts['general'];
|
||
|
$general['analytics_stats'] = 'off';
|
||
|
|
||
|
Helper::update_all_settings( $general, null, null );
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Should update pagespeed record.
|
||
|
*
|
||
|
* @param int $id Database row id.
|
||
|
* @return bool
|
||
|
*/
|
||
|
private function should_update_pagespeed( $id ) {
|
||
|
$record = DB::objects()->where( 'id', $id )->one();
|
||
|
|
||
|
return \time() > ( \strtotime( $record->pagespeed_refreshed ) + ( DAY_IN_SECONDS * 7 ) );
|
||
|
}
|
||
|
}
|