<?php
/**
* Get post types and top posts.
*
* @package automattic/jetpack
*/
if ( ! defined( 'ABSPATH' ) ) {
exit( 0 );
}
/**
* Top Posts & Pages block endpoint.
*/
class WPCOM_REST_API_V2_Endpoint_Top_Posts extends WP_REST_Controller {
/**
* Constructor.
*/
public function __construct() {
add_action( 'rest_api_init', array( $this, 'register_routes' ) );
}
/**
* Register endpoint routes.
*/
public function register_routes() {
register_rest_route(
'wpcom/v2',
'/post-types',
array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_post_types' ),
'permission_callback' => function () {
return current_user_can( 'edit_posts' );
},
),
)
);
// Number of posts and selected post types are not needed in the Editor.
// This is to minimise requests when it can already be handled by the block.
register_rest_route(
'wpcom/v2',
'/top-posts',
array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_top_posts' ),
'permission_callback' => function () {
return current_user_can( 'edit_posts' );
},
'args' => array(
'period' => array(
'description' => __( 'Timeframe for stats.', 'jetpack' ),
'type' => array( 'string', 'integer' ),
'required' => true,
'validate_callback' => function ( $param ) {
return is_numeric( $param ) || is_string( $param );
},
),
),
),
)
);
}
/**
* Get the site's post types.
*
* @return array Site's post types.
*/
public function get_post_types() {
$post_types = array_values( get_post_types( array( 'public' => true ) ) );
$post_types_array = array();
foreach ( $post_types as $type ) {
$post_types_array[] = array(
'label' => get_post_type_object( $type )->labels->name,
'id' => $type,
);
}
return $post_types_array;
}
/**
* Get the site's top content.
*
* @param \WP_REST_Request $request request object.
*
* @return array Data on top posts.
*/
public function get_top_posts( $request ) {
if ( ! class_exists( 'Jetpack_Top_Posts_Helper' ) ) {
require_once JETPACK__PLUGIN_DIR . '_inc/lib/class-jetpack-top-posts-helper.php';
}
$period = $request->get_param( 'period' );
return Jetpack_Top_Posts_Helper::get_top_posts( $period );
}
}
wpcom_rest_api_v2_load_plugin( 'WPCOM_REST_API_V2_Endpoint_Top_Posts' );