summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/_inc/lib/core-api/class.jetpack-core-api-site-endpoints.php')
-rw-r--r--plugins/jetpack/_inc/lib/core-api/class.jetpack-core-api-site-endpoints.php75
1 files changed, 75 insertions, 0 deletions
diff --git a/plugins/jetpack/_inc/lib/core-api/class.jetpack-core-api-site-endpoints.php b/plugins/jetpack/_inc/lib/core-api/class.jetpack-core-api-site-endpoints.php
index 68327f51..c8fba69c 100644
--- a/plugins/jetpack/_inc/lib/core-api/class.jetpack-core-api-site-endpoints.php
+++ b/plugins/jetpack/_inc/lib/core-api/class.jetpack-core-api-site-endpoints.php
@@ -48,6 +48,69 @@ class Jetpack_Core_API_Site_Endpoint {
}
/**
+ * Returns the result of `/sites/%s/posts/%d/related` endpoint call.
+ * Results are not cached and are retrieved in real time.
+ *
+ * @since 6.7.0
+ *
+ * @param int ID of the post to get related posts of
+ *
+ * @return array
+ */
+ public static function get_related_posts( $api_request ) {
+ $params = $api_request->get_params();
+ $post_id = ! empty( $params['post_id'] ) ? absint( $params['post_id'] ) : 0;
+
+ if ( ! $post_id ) {
+ return new WP_Error(
+ 'incorrect_post_id',
+ esc_html__( 'You need to specify a correct ID of a post to return related posts for.', 'jetpack' ),
+ array( 'status' => 400 )
+ );
+ }
+
+ // Make the API request
+ $request = sprintf( '/sites/%d/posts/%d/related', Jetpack_Options::get_option( 'id' ), $post_id );
+ $request_args = array(
+ 'headers' => array(
+ 'Content-Type' => 'application/json',
+ ),
+ 'timeout' => 10,
+ 'method' => 'POST',
+ );
+ $response = Jetpack_Client::wpcom_json_api_request_as_blog( $request, '1.1', $request_args );
+
+ // Bail if there was an error or malformed response
+ if ( is_wp_error( $response ) || ! is_array( $response ) || ! isset( $response['body'] ) ) {
+ return new WP_Error(
+ 'failed_to_fetch_data',
+ esc_html__( 'Unable to fetch the requested data.', 'jetpack' ),
+ array( 'status' => 400 )
+ );
+ }
+
+ // Decode the results
+ $results = json_decode( wp_remote_retrieve_body( $response ), true );
+
+ $related_posts = array();
+ if ( isset( $results['hits'] ) && is_array( $results['hits'] ) ) {
+ $related_posts_ids = array_map( array( 'Jetpack_Core_API_Site_Endpoint', 'get_related_post_id' ), $results['hits'] );
+
+ $related_posts_instance = Jetpack_RelatedPosts::init();
+ foreach ( $related_posts_ids as $related_post_id ) {
+ $related_posts[] = $related_posts_instance->get_related_post_data_for_post( $related_post_id, 0, 0 );
+ }
+ }
+
+ return rest_ensure_response( array(
+ 'code' => 'success',
+ 'message' => esc_html__( 'Related posts retrieved successfully.', 'jetpack' ),
+ 'posts' => $related_posts,
+ )
+ );
+ }
+
+ /**
* Check that the current user has permissions to request information about this site.
*
* @since 5.1.0
@@ -57,4 +120,16 @@ class Jetpack_Core_API_Site_Endpoint {
public static function can_request() {
return current_user_can( 'jetpack_manage_modules' );
}
+
+ /**
+ * Returns the post ID out of a related post entry from the
+ * `/sites/%s/posts/%d/related` WP.com endpoint.
+ *
+ * @since 6.7.0
+ *
+ * @return int
+ */
+ public static function get_related_post_id( $item ) {
+ return $item['fields']['post_id'];
+ }
}