PluginProbe
Gutenberg / 22.9.0
Gutenberg v22.9.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 / scripts / block-library / calendar.php

calendar.php in Gutenberg 22.9.0, at build/scripts/block-library/calendar.php

190 lines 6.1 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/calendar` block.
4 *
5 * @package WordPress
6 */
7
8 /**
9 * Renders the `core/calendar` block on server.
10 *
11 * @since 5.2.0
12 *
13 * @global int $monthnum.
14 * @global int $year.
15 *
16 * @param array $attributes The block attributes.
17 *
18 * @return string Returns the block content.
19 */
20 function gutenberg_render_block_core_calendar( $attributes ) {
21 global $monthnum, $year;
22
23 // Calendar shouldn't be rendered
24 // when there are no published posts on the site.
25 if ( ! gutenberg_block_core_calendar_has_published_posts() ) {
26 if ( is_user_logged_in() ) {
27 return '<div>' . __( 'The calendar block is hidden because there are no published posts.' ) . '</div>';
28 }
29 return '';
30 }
31
32 $previous_monthnum = $monthnum;
33 $previous_year = $year;
34
35 if ( isset( $attributes['month'] ) && isset( $attributes['year'] ) ) {
36 $permalink_structure = get_option( 'permalink_structure' );
37 if (
38 str_contains( $permalink_structure, '%monthnum%' ) &&
39 str_contains( $permalink_structure, '%year%' )
40 ) {
41 $monthnum = $attributes['month'];
42 $year = $attributes['year'];
43 }
44 }
45
46 $color_block_styles = array();
47
48 // Text color.
49 $preset_text_color = array_key_exists( 'textColor', $attributes ) ? "var:preset|color|{$attributes['textColor']}" : null;
50 $custom_text_color = $attributes['style']['color']['text'] ?? null;
51 $color_block_styles['text'] = $preset_text_color ? $preset_text_color : $custom_text_color;
52
53 // Background Color.
54 $preset_background_color = array_key_exists( 'backgroundColor', $attributes ) ? "var:preset|color|{$attributes['backgroundColor']}" : null;
55 $custom_background_color = $attributes['style']['color']['background'] ?? null;
56 $color_block_styles['background'] = $preset_background_color ? $preset_background_color : $custom_background_color;
57
58 // Generate color styles and classes.
59 $styles = gutenberg_style_engine_get_styles( array( 'color' => $color_block_styles ), array( 'convert_vars_to_classnames' => true ) );
60 $inline_styles = empty( $styles['css'] ) ? '' : sprintf( ' style="%s"', esc_attr( $styles['css'] ) );
61 $classnames = empty( $styles['classnames'] ) ? '' : ' ' . esc_attr( $styles['classnames'] );
62 if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
63 $classnames .= ' has-link-color';
64 }
65 // Apply color classes and styles to the calendar.
66 $calendar = str_replace( '<table', '<table' . $inline_styles, get_calendar( true, false ) );
67 $calendar = str_replace( 'class="wp-calendar-table', 'class="wp-calendar-table' . $classnames, $calendar );
68
69 $wrapper_attributes = get_block_wrapper_attributes();
70 $output = sprintf(
71 '<div %1$s>%2$s</div>',
72 $wrapper_attributes,
73 $calendar
74 );
75
76 $monthnum = $previous_monthnum;
77 $year = $previous_year;
78
79 return $output;
80 }
81
82 /**
83 * Registers the `core/calendar` block on server.
84 *
85 * @since 5.2.0
86 */
87 function gutenberg_register_block_core_calendar() {
88 register_block_type_from_metadata(
89 __DIR__ . '/calendar',
90 array(
91 'render_callback' => 'gutenberg_render_block_core_calendar',
92 )
93 );
94 }
95
96 add_action( 'init', 'gutenberg_register_block_core_calendar', 20 );
97
98 /**
99 * Returns whether or not there are any published posts.
100 *
101 * Used to hide the calendar block when there are no published posts.
102 * This compensates for a known Core bug: https://core.trac.wordpress.org/ticket/12016
103 *
104 * @since 5.9.0
105 *
106 * @return bool Has any published posts or not.
107 */
108 function gutenberg_block_core_calendar_has_published_posts() {
109 // Multisite already has an option that stores the count of the published posts.
110 // Let's use that for multisites.
111 if ( is_multisite() ) {
112 return 0 < (int) get_option( 'post_count' );
113 }
114
115 // On single sites we try our own cached option first.
116 $has_published_posts = get_option( 'wp_calendar_block_has_published_posts', null );
117 if ( null !== $has_published_posts ) {
118 return (bool) $has_published_posts;
119 }
120
121 // No cache hit, let's update the cache and return the cached value.
122 return gutenberg_block_core_calendar_update_has_published_posts();
123 }
124
125 /**
126 * Queries the database for any published post and saves
127 * a flag whether any published post exists or not.
128 *
129 * @since 5.9.0
130 *
131 * @global wpdb $wpdb WordPress database abstraction object.
132 *
133 * @return bool Has any published posts or not.
134 */
135 function gutenberg_block_core_calendar_update_has_published_posts() {
136 global $wpdb;
137 $has_published_posts = (bool) $wpdb->get_var( "SELECT 1 as test FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1" );
138 update_option( 'wp_calendar_block_has_published_posts', $has_published_posts );
139 return $has_published_posts;
140 }
141
142 // We only want to register these functions and actions when
143 // we are on single sites. On multi sites we use `post_count` option.
144 if ( ! is_multisite() ) {
145 /**
146 * Handler for updating the has published posts flag when a post is deleted.
147 *
148 * @since 5.9.0
149 *
150 * @param int $post_id Deleted post ID.
151 */
152 function gutenberg_block_core_calendar_update_has_published_post_on_delete( $post_id ) {
153 $post = get_post( $post_id );
154
155 if ( ! $post || 'publish' !== $post->post_status || 'post' !== $post->post_type ) {
156 return;
157 }
158
159 gutenberg_block_core_calendar_update_has_published_posts();
160 }
161
162 /**
163 * Handler for updating the has published posts flag when a post status changes.
164 *
165 * @since 5.9.0
166 *
167 * @param string $new_status The status the post is changing to.
168 * @param string $old_status The status the post is changing from.
169 * @param WP_Post $post Post object.
170 */
171 function gutenberg_block_core_calendar_update_has_published_post_on_transition_post_status( $new_status, $old_status, $post ) {
172 if ( $new_status === $old_status ) {
173 return;
174 }
175
176 if ( 'post' !== get_post_type( $post ) ) {
177 return;
178 }
179
180 if ( 'publish' !== $new_status && 'publish' !== $old_status ) {
181 return;
182 }
183
184 gutenberg_block_core_calendar_update_has_published_posts();
185 }
186
187 add_action( 'delete_post', 'gutenberg_block_core_calendar_update_has_published_post_on_delete' );
188 add_action( 'transition_post_status', 'gutenberg_block_core_calendar_update_has_published_post_on_transition_post_status', 10, 3 );
189 }
190