From 4876b5da035651553a8108ef489b170d05ec9984 Mon Sep 17 00:00:00 2001 From: Dac Chartrand Date: Mon, 29 Jan 2018 16:46:20 -0500 Subject: [PATCH] Better, strong, faster, ...sort-y-er? (issue #65) --- inc/helpers/namespace.php | 67 +++++++++++++++++++++++---------- partials/content-front-page.php | 10 +++-- 2 files changed, 53 insertions(+), 24 deletions(-) diff --git a/inc/helpers/namespace.php b/inc/helpers/namespace.php index 3c1c00c..9f49764 100644 --- a/inc/helpers/namespace.php +++ b/inc/helpers/namespace.php @@ -22,36 +22,63 @@ function get_catalog_data( $page = 1, $per_page = 10, $orderby = 'title', $licen return [ 'pages' => 0, 'books' => [] ]; // Bail } - $request = new \WP_REST_Request( 'GET', '/pressbooks/v2/books' ); - $request->set_query_params( - [ - 'page' => $page, - 'per_page' => $per_page, - ] + /** + * Filter the WP_Site_Query args for the catalog display. + * + * @since 5.0.0 + */ + $args = apply_filters( + 'pb_aldine_catalog_query_args', + /** @deprecated */ + apply_filters( 'pb_publisher_catalog_query_args', [ 'public' => '1' ] ) ); - $response = rest_do_request( $request ); - $pages = $response->headers['X-WP-TotalPages']; - $data = rest_get_server()->response_to_data( $response, true ); - $books = []; - foreach ( $data as $key => $book ) { - if ( ! get_blog_option( $book['id'], \Aldine\Admin\BLOG_OPTION ) ) { - continue; // Skip + + /** @var \WP_Site $site */ + + $sites = new \WP_Site_Query( $args ); + $sites_in_catalog = []; + foreach ( $sites->sites as $site ) { + // TODO: Each call to get_blog_option() is a call to switch_to_blog(). Not good. Use [ https://core.trac.wordpress.org/ticket/37923 ] when available. + if ( get_blog_option( $site->blog_id, \Aldine\Admin\BLOG_OPTION ) ) { + $sites_in_catalog[] = $site; } - $book['title'] = $book['metadata']['name']; - $book['date-published'] = $book['metadata']['datePublished'] ?? ''; - $book['subject'] = $book['metadata']['about'][0]['identifier'] ?? ''; - $books[] = $book; } if ( $orderby === 'latest' ) { - $books = wp_list_sort( $books, $orderby, 'desc' ); + $sites_in_catalog = wp_list_sort( $sites_in_catalog, $orderby, 'desc' ); } else { - $books = wp_list_sort( $books, $orderby ); + $sites_in_catalog = wp_list_sort( $sites_in_catalog, $orderby ); + } + + $total_pages = ceil( count( $sites_in_catalog ) / $per_page ); + $offset = ( $page - 1 ) * $per_page; + $books = []; + foreach ( $sites_in_catalog as $i => $site ) { + if ( $i < $offset ) { + continue; + } + + switch_to_blog( $site->blog_id ); + $schema = \Pressbooks\Metadata\book_information_to_schema( + \Pressbooks\Book::getBookInformation() + ); + $book['title'] = $schema['name']; + $book['date-published'] = $schema['datePublished'] ?? ''; + $book['subject'] = $schema['about'][0]['identifier'] ?? ''; + $book['link'] = get_blogaddress_by_id( $site->blog_id ); + $book['metadata'] = $schema; + $books[] = $book; + restore_current_blog(); + + if ( count( $books ) >= $per_page ) { + break; + } } - return [ 'pages' => $pages, 'books' => $books ]; + return [ 'pages' => $total_pages, 'books' => $books ]; } + /** * Get licenses for catalog display. * diff --git a/partials/content-front-page.php b/partials/content-front-page.php index debdf28..fd472a4 100644 --- a/partials/content-front-page.php +++ b/partials/content-front-page.php @@ -15,10 +15,12 @@ use function Aldine\Helpers\get_catalog_data; $front_page_catalog = get_option( 'pb_front_page_catalog' ); $latest_books_title = get_option( 'pb_front_page_catalog_title', __( 'Our Latest Titles', 'pressbooks-aldine' ) ); -$page = ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1; -$catalog_data = get_catalog_data( $page, 3 ); -$previous_page = ( $page > 1 ) ? $page - 1 : 0; -$next_page = $page + 1; +if ( get_option( 'pb_front_page_catalog' ) ) { + $page = ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1; + $catalog_data = get_catalog_data( $page, 3 ); + $previous_page = ( $page > 1 ) ? $page - 1 : 0; + $next_page = $page + 1; +} ?>