Paginate stories

This commit is contained in:
Tetrakern 2023-02-16 13:52:23 +01:00
parent 6d654fb203
commit 7a724e700e
2 changed files with 62 additions and 5 deletions

View File

@ -89,6 +89,11 @@ if ( ! defined( 'FICTIONEER_API_STORYGRAPH_CACHE_TTL' ) ) {
define( 'FICTIONEER_API_STORYGRAPH_CACHE_TTL', 3600 ); define( 'FICTIONEER_API_STORYGRAPH_CACHE_TTL', 3600 );
} }
// Integer: Storygraph API number of stories per page
if ( ! defined( 'FICTIONEER_API_STORYGRAPH_STORIES_PER_PAGE' ) ) {
define( 'FICTIONEER_API_STORYGRAPH_STORIES_PER_PAGE', 10 );
}
/* /*
* Booleans * Booleans
*/ */

View File

@ -24,6 +24,7 @@ if ( ! function_exists( 'fictioneer_api_get_story_node' ) ) {
// Setup // Setup
$author_id = get_post_field( 'post_author', $story_id ); $author_id = get_post_field( 'post_author', $story_id );
$author_url = get_the_author_meta( 'user_url', $author_id );
$co_author_ids = fictioneer_get_field( 'fictioneer_story_co_authors', $story_id ); $co_author_ids = fictioneer_get_field( 'fictioneer_story_co_authors', $story_id );
$language = fictioneer_get_field( 'fictioneer_story_language', $story_id ); $language = fictioneer_get_field( 'fictioneer_story_language', $story_id );
$node = []; $node = [];
@ -34,14 +35,25 @@ if ( ! function_exists( 'fictioneer_api_get_story_node' ) ) {
$node['url'] = get_permalink( $story_id ); $node['url'] = get_permalink( $story_id );
$node['language'] = empty( $language ) ? get_bloginfo( 'language' ) : $language; $node['language'] = empty( $language ) ? get_bloginfo( 'language' ) : $language;
$node['title'] = $data['title']; $node['title'] = $data['title'];
$node['author'] = get_the_author_meta( 'display_name', $author_id );
// Author
$node['author'] = [];
$node['author']['name'] = get_the_author_meta( 'display_name', $author_id );
if ( ! empty( $author_url ) ) $node['author']['url'] = $author_url;
// Co-authors
if ( ! empty( $co_author_ids ) ) { if ( ! empty( $co_author_ids ) ) {
$node['coAuthors'] = []; $node['coAuthors'] = [];
foreach ( $co_author_ids as $co_id ) { foreach ( $co_author_ids as $co_id ) {
if ( $co_id != $author_id ) { if ( $co_id != $author_id ) {
$node['coAuthors'][] = get_the_author_meta( 'display_name', $co_id ); $co_author_url = get_the_author_meta( 'user_url', $co_id );
$co_author_node = [];
$co_author_node['name'] = get_the_author_meta( 'display_name', $co_id );
if ( ! empty( $co_author_url ) ) $co_author_node['url'] = $co_author_url;
$node['coAuthors'][] = $co_author_node;
} }
} }
} }
@ -85,6 +97,9 @@ if ( ! function_exists( 'fictioneer_api_get_story_node' ) ) {
foreach ( $data['chapter_ids'] as $chapter_id ) { foreach ( $data['chapter_ids'] as $chapter_id ) {
// Chapter data // Chapter data
$author_id = get_post_field( 'post_author', $chapter_id );
$author_url = get_the_author_meta( 'user_url', $author_id );
$co_author_ids = fictioneer_get_field( 'fictioneer_chapter_co_authors', $chapter_id );
$group = fictioneer_get_field( 'fictioneer_chapter_group', $chapter_id ); $group = fictioneer_get_field( 'fictioneer_chapter_group', $chapter_id );
$rating = fictioneer_get_field( 'fictioneer_chapter_rating', $chapter_id ); $rating = fictioneer_get_field( 'fictioneer_chapter_rating', $chapter_id );
$language = fictioneer_get_field( 'fictioneer_chapter_language', $chapter_id ); $language = fictioneer_get_field( 'fictioneer_chapter_language', $chapter_id );
@ -98,11 +113,32 @@ if ( ! function_exists( 'fictioneer_api_get_story_node' ) ) {
$chapter['guid'] = get_the_guid( $chapter_id ); $chapter['guid'] = get_the_guid( $chapter_id );
$chapter['url'] = get_permalink( $chapter_id ); $chapter['url'] = get_permalink( $chapter_id );
$chapter['language'] = empty( $language ) ? get_bloginfo( 'language' ) : $language; $chapter['language'] = empty( $language ) ? get_bloginfo( 'language' ) : $language;
// author + co-authors
if ( ! empty( $prefix ) ) $chapter['prefix'] = $prefix; if ( ! empty( $prefix ) ) $chapter['prefix'] = $prefix;
$chapter['title'] = fictioneer_get_safe_title( $chapter_id ); $chapter['title'] = fictioneer_get_safe_title( $chapter_id );
if ( ! empty( $group ) ) $chapter['group'] = $group; if ( ! empty( $group ) ) $chapter['group'] = $group;
// Chapter author
$chapter['author'] = [];
$chapter['author']['name'] = get_the_author_meta( 'display_name', $author_id );
if ( ! empty( $author_url ) ) $chapter['author']['url'] = $author_url;
// Chapter co-authors
if ( ! empty( $co_author_ids ) ) {
$chapter['coAuthors'] = [];
foreach ( $co_author_ids as $co_id ) {
if ( $co_id != $author_id ) {
$co_author_url = get_the_author_meta( 'user_url', $co_id );
$co_author_node = [];
$co_author_node['name'] = get_the_author_meta( 'display_name', $co_id );
if ( ! empty( $co_author_url ) ) $co_author_node['url'] = $co_author_url;
$chapter['coAuthors'][] = $co_author_node;
}
}
}
// Chapter meta // Chapter meta
$chapter['published'] = get_post_time( 'U', true, $chapter_id ); $chapter['published'] = get_post_time( 'U', true, $chapter_id );
$chapter['modified'] = get_post_modified_time( 'U', true, $chapter_id ); $chapter['modified'] = get_post_modified_time( 'U', true, $chapter_id );
@ -225,7 +261,7 @@ if ( TRUE ) {
function () { function () {
register_rest_route( register_rest_route(
'storygraph/v1', 'storygraph/v1',
'/stories', '/stories(?:/(?P<page>\d+))?',
array( array(
'methods' => 'GET', 'methods' => 'GET',
'callback' => 'fictioneer_api_request_stories', 'callback' => 'fictioneer_api_request_stories',
@ -248,6 +284,7 @@ if ( ! function_exists( 'fictioneer_api_request_stories' ) ) {
function fictioneer_api_request_stories( WP_REST_Request $data ) { function fictioneer_api_request_stories( WP_REST_Request $data ) {
// Setup // Setup
$page = max($data['page'] ?? 1, 1);
$graph = []; $graph = [];
// Prepare query // Prepare query
@ -256,13 +293,25 @@ if ( ! function_exists( 'fictioneer_api_request_stories' ) ) {
'post_status' => 'publish', 'post_status' => 'publish',
'orderby' => 'date', 'orderby' => 'date',
'order' => 'DESC', 'order' => 'DESC',
'posts_per_page' => -1 'posts_per_page' => FICTIONEER_API_STORYGRAPH_STORIES_PER_PAGE,
'paged' => $page
); );
// Query stories // Query stories
$query = new WP_Query( $query_args ); $query = new WP_Query( $query_args );
$stories = $query->posts; $stories = $query->posts;
// Return error if...
if ( $page > $query->max_num_pages ) {
return rest_ensure_response(
new WP_Error(
'invalid_story_id',
'Requested page number exceeds maximum pages.',
['status' => '400']
)
);
}
// Site meta // Site meta
$graph['url'] = get_home_url( null, '', 'rest' ); $graph['url'] = get_home_url( null, '', 'rest' );
$graph['language'] = get_bloginfo( 'language' ); $graph['language'] = get_bloginfo( 'language' );
@ -288,6 +337,9 @@ if ( ! function_exists( 'fictioneer_api_request_stories' ) ) {
} }
// Request meta // Request meta
$graph['page'] = $page;
$graph['perPage'] = FICTIONEER_API_STORYGRAPH_STORIES_PER_PAGE;
$graph['maxPages'] = $query->max_num_pages;
$graph['timestamp'] = current_time( 'U', true ); $graph['timestamp'] = current_time( 'U', true );
$graph['cached'] = false; $graph['cached'] = false;