1000000, 'meta_key' => $dc::IN_CATALOG, // @codingStandardsIgnoreLine 'meta_value' => 1, // @codingStandardsIgnoreLine 'public' => 1, 'archived' => 0, 'spam' => 0, 'deleted' => 0, 'network_id' => get_network()->site_id, ] ) ); return get_catalog_data( $args ); } /** * Get featured books * * @return array */ function get_featured_books(): array { $featured_books = []; foreach ( range( 1, MAX_FEATURED_BOOKS ) as $book ) { $book = get_option( 'pb_front_page_catalog_book_' . $book ); if ( $book ) { $featured_books[] = $book; } } if ( empty( $featured_books ) ) { return []; } $args = [ 'site__in' => $featured_books, 'sort_by_featured' => true, ]; return get_catalog_data( $args ); } /** * Get catalog data * * @param array $args Query arguments * @return array[] */ function get_catalog_data( array $args ): array { $dc = BookDataCollector::init(); /** * WordPress site * * @var \WP_Site $site */ $sites_in_catalog = []; $sites = get_sites( $args ); foreach ( $sites as $site ) { $site->pb_title = $dc->get( $site->blog_id, $dc::TITLE ); $sites_in_catalog[] = $site; } $books = []; foreach ( $sites_in_catalog as $site ) { $book_information = $dc->get( $site->blog_id, $dc::BOOK_INFORMATION_ARRAY ); if ( is_array( $book_information ) && ! empty( $book_information ) ) { $schema = book_information_to_schema( $book_information ); $book['title'] = $schema['name']; $book['id'] = $site->blog_id; $book['link'] = get_blogaddress_by_id( $site->blog_id ); $book['metadata'] = $schema; $books[] = $book; } } // Sort by featured books. if ( isset( $args['sort_by_featured'] ) ) { usort( $books, function ( $a, $b ) use ( $args ) { return array_search( $a['id'], $args['site__in'], true ) - array_search($b['id'], $args['site__in'], true); } ); } return [ 'books' => $books, ]; } /** * Get paginated catalog data * * @param int $page Catalog page * @param int $per_page Books per page * @param string $orderby Sort order * @param string $license Copyright license * @param string $subject Subject * * @return array */ function get_paginated_catalog_data( $page = 1, $per_page = 10, $orderby = 'title', $license = '', $subject = '' ) { if ( ! defined( 'PB_PLUGIN_VERSION' ) ) { return [ 'pages' => 0, 'books' => [], ]; } $dc = BookDataCollector::init(); /** * Filter the WP_Site_Query args for the catalog display. * * @since 1.0.0 */ $args = apply_filters( 'pb_aldine_catalog_query_args', /** * Deprecation notice * * @deprecated 1.0.0 * * @see Pressbooks Publisher */ apply_filters( 'pb_publisher_catalog_query_args', [ 'number' => 1000000, 'meta_key' => $dc::IN_CATALOG, // @codingStandardsIgnoreLine 'meta_value' => 1, // @codingStandardsIgnoreLine 'public' => 1, 'archived' => 0, 'spam' => 0, 'deleted' => 0, 'network_id' => get_network()->site_id, ] ) ); /** * WordPress site * * @var \WP_Site $site */ $sites_in_catalog = []; $sites = get_sites( $args ); foreach ( $sites as $site ) { $site->pb_title = $dc->get( $site->blog_id, $dc::TITLE ); $sites_in_catalog[] = $site; } if ( $orderby === 'latest' ) { $sites_in_catalog = wp_list_sort( $sites_in_catalog, 'last_updated', 'DESC' ); } else { $sites_in_catalog = wp_list_sort( $sites_in_catalog, 'pb_title', 'ASC' ); } $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; } $book_information = $dc->get( $site->blog_id, $dc::BOOK_INFORMATION_ARRAY ); if ( is_array( $book_information ) && ! empty( $book_information ) ) { $schema = book_information_to_schema( $book_information ); $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; } if ( count( $books ) >= $per_page ) { break; } } return [ 'pages' => $total_pages, 'books' => $books, ]; } /** * Get licenses for catalog display. * * @return array */ function get_catalog_licenses() { if ( defined( 'PB_PLUGIN_VERSION' ) ) { $licenses = ( new Licensing() )->getSupportedTypes(); foreach ( $licenses as $key => $value ) { $licenses[ $key ] = preg_replace( '/\([^)]+\)/', '', $value['desc'] ); } return $licenses; } return []; } /** * Get licenses currently in use. * * @param array $catalog_data Catalog data * * @return array */ function get_available_licenses( $catalog_data ) { $licenses = []; $licensing = new Licensing(); foreach ( $catalog_data['books'] as $book ) { $license = $licensing->getLicenseFromUrl( $book['metadata']['license']['url'] ); if ( ! in_array( $license, $licenses, true ) ) { $licenses[] = $license; } } return $licenses; } /** * Get institutions for catalog display. * * @return array */ function get_institutions(): array { if ( ! defined( 'PB_PLUGIN_VERSION' ) ) { return []; } return get_institutions_flattened(); } /** * Get institutions currently in use. * * @param array $catalog_data Catalog data * * @return array */ function get_available_institutions( array $catalog_data ): array { $institution_list = get_institutions(); $book_institutions = array_reduce( $catalog_data['books'], static function( $carry, $book ) { $names = array_reduce( $book['metadata']['institutions'] ?? [], static function( $carry, $institution ) { return array_merge( $carry, [ $institution['name'] ] ); }, [] ); return array_merge( $carry, $names ); }, [] ); return array_intersect( $institution_list, $book_institutions ); } /** * Get subjects currently in use. * * @param array $catalog_data Catalog data * * @return array */ function get_available_subjects( $catalog_data ) { $subjects = []; foreach ( $catalog_data['books'] as $book ) { if ( ! empty( $book['subject'] ) && ! is_bisac( $book['subject'] ) ) { $subjects[ substr( $book['subject'], 0, 1 ) ][] = substr( $book['subject'], 0, 2 ); } } return $subjects; } /** * Return the default (non-page) menu items. * * @param string $items Items * * @return string $items */ function get_default_menu( $items = '' ) { $item_classes = [ 'prefix' => 'nav--primary-item', 'Home' => 'home', 'Contact' => 'contact', 'SignIn' => 'sign-in', 'SignUp' => 'sign-up', 'Admin' => 'admin', 'CreateANewBook' => 'create-book', 'MyBooks' => 'my-books', 'SignOut' => 'sign-out', ]; $link = ( is_front_page() ) ? network_home_url( '#main' ) : network_home_url( '/' ); $items = sprintf( '