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

<?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 );
}
}