You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
6.1 KiB
PHP
233 lines
6.1 KiB
PHP
<?php
|
|
/**
|
|
* Stories class.
|
|
*
|
|
* @link https://github.com/googleforcreators/web-stories-wp
|
|
*
|
|
* @copyright 2020 Google LLC
|
|
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
|
*/
|
|
|
|
/**
|
|
* Copyright 2020 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
declare(strict_types = 1);
|
|
|
|
namespace Google\Web_Stories;
|
|
|
|
use Google\Web_Stories\Renderer\Stories\Carousel_Renderer;
|
|
use Google\Web_Stories\Renderer\Stories\Generic_Renderer;
|
|
use Google\Web_Stories\Renderer\Stories\Renderer;
|
|
use WP_Post;
|
|
use WP_Query;
|
|
|
|
/**
|
|
* Stories class.
|
|
*
|
|
* @phpstan-type StoryAttributes array{
|
|
* view_type?: string,
|
|
* number_of_columns?: int,
|
|
* show_title?: bool,
|
|
* show_author?: bool,
|
|
* show_date?: bool,
|
|
* show_archive_link?: bool|string,
|
|
* show_excerpt?: bool,
|
|
* image_alignment?: string,
|
|
* class?: string,
|
|
* archive_link_label?: string,
|
|
* circle_size?: int,
|
|
* sharp_corners?: bool,
|
|
* order?: string,
|
|
* orderby?: string,
|
|
* align?: string
|
|
* }
|
|
* @phpstan-type StoryAttributesWithDefaults array{
|
|
* view_type: string,
|
|
* number_of_columns: int,
|
|
* show_title: bool,
|
|
* show_author: bool,
|
|
* show_date: bool,
|
|
* show_archive_link: bool|string,
|
|
* show_excerpt: bool,
|
|
* image_alignment: string,
|
|
* class: string,
|
|
* archive_link_label: string,
|
|
* circle_size: int,
|
|
* sharp_corners: bool,
|
|
* order?: string,
|
|
* orderby?: string,
|
|
* align?: string
|
|
* }
|
|
*/
|
|
class Story_Query {
|
|
/**
|
|
* Story attributes
|
|
*
|
|
* @since 1.5.0
|
|
*
|
|
* @var array<string, mixed> An array of story attributes.
|
|
*/
|
|
protected array $story_attributes = [];
|
|
|
|
/**
|
|
* Story query arguments.
|
|
*
|
|
* @since 1.5.0
|
|
*
|
|
* @var array<string, mixed> An array of query arguments.
|
|
*/
|
|
protected array $query_args = [];
|
|
|
|
/**
|
|
* Renderer object.
|
|
*
|
|
* @since 1.5.0
|
|
*/
|
|
public Renderer $renderer;
|
|
|
|
/**
|
|
* Class constructor
|
|
*
|
|
* @since 1.5.0
|
|
*
|
|
* @param array $story_attributes {
|
|
* An array of story attributes.
|
|
*
|
|
* @type string $view_type Stories View type. Default circles.
|
|
* @type int $number_of_columns Number of columns to show in grid view. Default 2.
|
|
* @type bool $show_title Whether to show story title or not. Default false.
|
|
* @type bool $show_author Whether to show story author or not. Default false.
|
|
* @type bool $show_date Whether to show story date or not. Default false.
|
|
* @type bool $show_archive_link Whether to show view all link or not. Default false.
|
|
* @type string $archive_link_label The label for view all link. Default 'View all stories'.
|
|
* @type string $image_alignment The list mode image alignment. Default 'left'.
|
|
* @type string $class Additional CSS classes for the container. Default empty string.
|
|
* }
|
|
* @param array<string, mixed> $query_args An array of query arguments for story. {@see WP_Query::parse_query()} for
|
|
* all available arguments.
|
|
*
|
|
* @phpstan-param StoryAttributes $story_attributes
|
|
*/
|
|
public function __construct( array $story_attributes = [], array $query_args = [] ) {
|
|
$this->story_attributes = $story_attributes;
|
|
|
|
$default_query_args = [
|
|
'post_type' => Story_Post_Type::POST_TYPE_SLUG,
|
|
'posts_per_page' => 10,
|
|
'post_status' => 'publish',
|
|
'suppress_filters' => false,
|
|
'no_found_rows' => true,
|
|
];
|
|
|
|
$this->query_args = wp_parse_args( $query_args, $default_query_args );
|
|
}
|
|
|
|
/**
|
|
* Retrieves an array of the latest stories, or Stories matching the given criteria.
|
|
*
|
|
* @since 1.5.0
|
|
*
|
|
* @return WP_Post[] List of Story posts.
|
|
*/
|
|
public function get_stories(): array {
|
|
$stories_query = new WP_Query();
|
|
|
|
/**
|
|
* List of story posts.
|
|
*
|
|
* @var WP_Post[] $result
|
|
*/
|
|
$result = $stories_query->query( $this->query_args );
|
|
|
|
update_post_thumbnail_cache( $stories_query );
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Instantiates the renderer classes based on the view type.
|
|
*
|
|
* @since 1.5.0
|
|
*
|
|
* @return Renderer Renderer Instance.
|
|
*/
|
|
public function get_renderer(): Renderer {
|
|
$story_attributes = $this->get_story_attributes();
|
|
$view_type = ! empty( $story_attributes['view_type'] ) ? $story_attributes['view_type'] : '';
|
|
|
|
switch ( $view_type ) {
|
|
case 'carousel':
|
|
case 'circles':
|
|
$renderer = new Carousel_Renderer( $this );
|
|
break;
|
|
case 'list':
|
|
case 'grid':
|
|
default:
|
|
$renderer = new Generic_Renderer( $this );
|
|
}
|
|
|
|
$renderer->init();
|
|
|
|
return $renderer;
|
|
}
|
|
|
|
/**
|
|
* Renders the stories output.
|
|
*
|
|
* @since 1.5.0
|
|
*/
|
|
public function render(): string {
|
|
$this->renderer = $this->get_renderer();
|
|
|
|
return $this->renderer->render();
|
|
}
|
|
|
|
/**
|
|
* Gets an array of story attributes.
|
|
*
|
|
* @since 1.5.0
|
|
*
|
|
* @return array<string, string|int|bool> An array of story attributes.
|
|
*
|
|
* @phpstan-return StoryAttributesWithDefaults
|
|
*/
|
|
public function get_story_attributes(): array {
|
|
$default_attributes = [
|
|
'view_type' => 'circles',
|
|
'number_of_columns' => 2,
|
|
'show_title' => false,
|
|
'show_author' => false,
|
|
'show_date' => false,
|
|
'show_excerpt' => false,
|
|
'show_archive_link' => false,
|
|
'sharp_corners' => false,
|
|
'archive_link_label' => __( 'View all stories', 'web-stories' ),
|
|
'image_alignment' => 'left',
|
|
'class' => '',
|
|
'circle_size' => 150,
|
|
];
|
|
|
|
/**
|
|
* Attributes with defaults applied.
|
|
*
|
|
* @phpstan-var StoryAttributesWithDefaults $attributes
|
|
*/
|
|
$attributes = wp_parse_args( $this->story_attributes, $default_attributes );
|
|
|
|
return $attributes;
|
|
}
|
|
}
|