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.
123 lines
2.9 KiB
PHP
123 lines
2.9 KiB
PHP
<?php
|
|
/**
|
|
* The Analytics Module
|
|
*
|
|
* @since 1.0.49
|
|
* @package RankMath
|
|
* @subpackage RankMath\modules
|
|
* @author Rank Math <support@rankmath.com>
|
|
*/
|
|
|
|
namespace RankMath\Analytics;
|
|
|
|
use stdClass;
|
|
use WP_Error;
|
|
use WP_REST_Request;
|
|
use RankMath\Helper;
|
|
use RankMath\Analytics\DB;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* Posts class.
|
|
*/
|
|
class Posts extends Objects {
|
|
|
|
/**
|
|
* Get post data.
|
|
*
|
|
* @param WP_REST_Request $request post object.
|
|
*
|
|
* @return object
|
|
*/
|
|
public function get_post( $request ) {
|
|
$id = $request->get_param( 'id' );
|
|
$post = DB::objects()
|
|
->where( 'object_id', $id )
|
|
->one();
|
|
|
|
if ( is_null( $post ) ) {
|
|
return [ 'errorMessage' => esc_html__( 'Sorry, no post found for given id.', 'rank-math' ) ];
|
|
}
|
|
|
|
$post->admin_url = admin_url();
|
|
$post->home_url = home_url();
|
|
|
|
return apply_filters( 'rank_math/analytics/post_data', (array) $post, $request );
|
|
}
|
|
|
|
/**
|
|
* Get posts by objects.
|
|
*
|
|
* @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_posts_rows_by_objects( WP_REST_Request $request ) {
|
|
$pre = apply_filters( 'rank_math/analytics/get_posts_rows_by_objects', false, $request );
|
|
if ( false !== $pre ) {
|
|
return $pre;
|
|
}
|
|
|
|
$cache_group = 'rank_math_posts_rows_by_objects';
|
|
$cache_key = $this->generate_hash( $request );
|
|
$data = $this->get_cache( $cache_key, $cache_group );
|
|
if ( false !== $data ) {
|
|
return rest_ensure_response( $data );
|
|
}
|
|
|
|
// Pagination.
|
|
$per_page = 25;
|
|
$offset = ( $request->get_param( 'page' ) - 1 ) * $per_page;
|
|
|
|
// Get objects filtered by seo score range and it's analytics data.
|
|
$objects = $this->get_objects_by_score( $request );
|
|
$pages = \array_keys( $objects['rows'] );
|
|
$console = $this->get_analytics_data(
|
|
[
|
|
'offset' => 0, // Here offset should always zero.
|
|
'perpage' => $objects['rowsFound'],
|
|
'sub_where' => " AND page IN ('" . join( "', '", $pages ) . "')",
|
|
]
|
|
);
|
|
|
|
// Construct return data.
|
|
$new_rows = [];
|
|
foreach ( $objects['rows'] as $object ) {
|
|
$page = $object['page'];
|
|
|
|
if ( isset( $console[ $page ] ) ) {
|
|
$object = \array_merge( $console[ $page ], $object );
|
|
}
|
|
|
|
if ( ! isset( $object['links'] ) ) {
|
|
$object['links'] = new stdClass();
|
|
}
|
|
|
|
$new_rows[ $page ] = $object;
|
|
}
|
|
|
|
$count = count( $new_rows );
|
|
|
|
if ( $offset + 25 <= $count ) {
|
|
$new_rows = array_slice( $new_rows, $offset, 25 );
|
|
|
|
} else {
|
|
$rest = $count - $offset;
|
|
$new_rows = array_slice( $new_rows, $offset, $rest );
|
|
}
|
|
if ( empty( $new_rows ) ) {
|
|
$new_rows['response'] = 'No Data';
|
|
}
|
|
|
|
$output = [
|
|
'rows' => $new_rows,
|
|
'rowsFound' => $objects['rowsFound'],
|
|
];
|
|
|
|
$this->set_cache( $cache_key, $output, $cache_group, DAY_IN_SECONDS );
|
|
|
|
return rest_ensure_response( $output );
|
|
}
|
|
}
|