PluginProbe
Gutenberg / 7.4.0
Gutenberg v7.4.0
23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 12.6.0 7.4.0 All 402 releases
gutenberg / build / block-library / blocks / latest-posts.php

latest-posts.php in Gutenberg 7.4.0, at build/block-library/blocks/latest-posts.php

178 lines 4.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Server-side rendering of the `core/latest-posts` block.
4 *
5 * @package WordPress
6 */
7
8 /**
9 * Renders the `core/latest-posts` block on server.
10 *
11 * @param array $attributes The block attributes.
12 *
13 * @return string Returns the post content with latest posts added.
14 */
15 function gutenberg_render_block_core_latest_posts( $attributes ) {
16 $args = array(
17 'posts_per_page' => $attributes['postsToShow'],
18 'post_status' => 'publish',
19 'order' => $attributes['order'],
20 'orderby' => $attributes['orderBy'],
21 'suppress_filters' => false,
22 );
23
24 if ( isset( $attributes['categories'] ) ) {
25 $args['category'] = $attributes['categories'];
26 }
27
28 $recent_posts = get_posts( $args );
29
30 $list_items_markup = '';
31
32 $excerpt_length = $attributes['excerptLength'];
33
34 foreach ( $recent_posts as $post ) {
35 $title = get_the_title( $post );
36 if ( ! $title ) {
37 $title = __( '(no title)' );
38 }
39 $list_items_markup .= sprintf(
40 '<li><a href="%1$s">%2$s</a>',
41 esc_url( get_permalink( $post ) ),
42 $title
43 );
44
45 if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) {
46 $list_items_markup .= sprintf(
47 '<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>',
48 esc_attr( get_the_date( 'c', $post ) ),
49 esc_html( get_the_date( '', $post ) )
50 );
51 }
52
53 if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent']
54 && isset( $attributes['displayPostContentRadio'] ) && 'excerpt' === $attributes['displayPostContentRadio'] ) {
55 $post_excerpt = $post->post_excerpt;
56 if ( ! ( $post_excerpt ) ) {
57 $post_excerpt = $post->post_content;
58 }
59 $trimmed_excerpt = esc_html( wp_trim_words( $post_excerpt, $excerpt_length, ' &hellip; ' ) );
60
61 $list_items_markup .= sprintf(
62 '<div class="wp-block-latest-posts__post-excerpt">%1$s',
63 $trimmed_excerpt
64 );
65
66 if ( strpos( $trimmed_excerpt, ' &hellip; ' ) !== false ) {
67 $list_items_markup .= sprintf(
68 '<a href="%1$s">%2$s</a></div>',
69 esc_url( get_permalink( $post ) ),
70 __( 'Read more' )
71 );
72 } else {
73 $list_items_markup .= sprintf(
74 '</div>'
75 );
76 }
77 }
78
79 if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent']
80 && isset( $attributes['displayPostContentRadio'] ) && 'full_post' === $attributes['displayPostContentRadio'] ) {
81 $list_items_markup .= sprintf(
82 '<div class="wp-block-latest-posts__post-full-content">%1$s</div>',
83 wp_kses_post( html_entity_decode( $post->post_content, ENT_QUOTES, get_option( 'blog_charset' ) ) )
84 );
85 }
86
87 $list_items_markup .= "</li>\n";
88 }
89
90 $class = 'wp-block-latest-posts wp-block-latest-posts__list';
91 if ( isset( $attributes['align'] ) ) {
92 $class .= ' align' . $attributes['align'];
93 }
94
95 if ( isset( $attributes['postLayout'] ) && 'grid' === $attributes['postLayout'] ) {
96 $class .= ' is-grid';
97 }
98
99 if ( isset( $attributes['columns'] ) && 'grid' === $attributes['postLayout'] ) {
100 $class .= ' columns-' . $attributes['columns'];
101 }
102
103 if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) {
104 $class .= ' has-dates';
105 }
106
107 if ( isset( $attributes['className'] ) ) {
108 $class .= ' ' . $attributes['className'];
109 }
110
111 return sprintf(
112 '<ul class="%1$s">%2$s</ul>',
113 esc_attr( $class ),
114 $list_items_markup
115 );
116 }
117
118 /**
119 * Registers the `core/latest-posts` block on server.
120 */
121 function gutenberg_register_block_core_latest_posts() {
122 register_block_type(
123 'core/latest-posts',
124 array(
125 'attributes' => array(
126 'align' => array(
127 'type' => 'string',
128 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ),
129 ),
130 'className' => array(
131 'type' => 'string',
132 ),
133 'categories' => array(
134 'type' => 'string',
135 ),
136 'postsToShow' => array(
137 'type' => 'number',
138 'default' => 5,
139 ),
140 'displayPostContent' => array(
141 'type' => 'boolean',
142 'default' => false,
143 ),
144 'displayPostContentRadio' => array(
145 'type' => 'string',
146 'default' => 'excerpt',
147 ),
148 'excerptLength' => array(
149 'type' => 'number',
150 'default' => 55,
151 ),
152 'displayPostDate' => array(
153 'type' => 'boolean',
154 'default' => false,
155 ),
156 'postLayout' => array(
157 'type' => 'string',
158 'default' => 'list',
159 ),
160 'columns' => array(
161 'type' => 'number',
162 'default' => 3,
163 ),
164 'order' => array(
165 'type' => 'string',
166 'default' => 'desc',
167 ),
168 'orderBy' => array(
169 'type' => 'string',
170 'default' => 'date',
171 ),
172 ),
173 'render_callback' => 'gutenberg_render_block_core_latest_posts',
174 )
175 );
176 }
177 add_action( 'init', 'gutenberg_register_block_core_latest_posts', 20 );
178