PluginProbe
Gutenberg / 12.1.0
Gutenberg v12.1.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 / calendar.php

calendar.php in Gutenberg 12.1.0, at build/block-library/blocks/calendar.php

154 lines 4.7 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 * @param array $attributes The block attributes.
12 *
13 * @return string Returns the block content.
14 */
15 function gutenberg_render_block_core_calendar( $attributes ) {
16 global $monthnum, $year;
17
18 // Calendar shouldn't be rendered
19 // when there are no published posts on the site.
20 if ( ! gutenberg_block_core_calendar_has_published_posts() ) {
21 if ( is_user_logged_in() ) {
22 return '<div>' . __( 'The calendar block is hidden because there are no published posts.' ) . '</div>';
23 }
24 return '';
25 }
26
27 $previous_monthnum = $monthnum;
28 $previous_year = $year;
29
30 if ( isset( $attributes['month'] ) && isset( $attributes['year'] ) ) {
31 $permalink_structure = get_option( 'permalink_structure' );
32 if (
33 strpos( $permalink_structure, '%monthnum%' ) !== false &&
34 strpos( $permalink_structure, '%year%' ) !== false
35 ) {
36 // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited
37 $monthnum = $attributes['month'];
38 // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited
39 $year = $attributes['year'];
40 }
41 }
42
43 $wrapper_attributes = get_block_wrapper_attributes();
44 $output = sprintf(
45 '<div %1$s>%2$s</div>',
46 $wrapper_attributes,
47 get_calendar( true, false )
48 );
49
50 // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited
51 $monthnum = $previous_monthnum;
52 // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited
53 $year = $previous_year;
54
55 return $output;
56 }
57
58 /**
59 * Registers the `core/calendar` block on server.
60 */
61 function gutenberg_register_block_core_calendar() {
62 register_block_type_from_metadata(
63 __DIR__ . '/calendar',
64 array(
65 'render_callback' => 'gutenberg_render_block_core_calendar',
66 )
67 );
68 }
69
70 add_action( 'init', 'gutenberg_register_block_core_calendar', 20 );
71
72 /**
73 * Returns whether or not there are any published posts.
74 *
75 * Used to hide the calendar block when there are no published posts.
76 * This compensates for a known Core bug: https://core.trac.wordpress.org/ticket/12016
77 *
78 * @return bool Has any published posts or not.
79 */
80 function gutenberg_block_core_calendar_has_published_posts() {
81 // Multisite already has an option that stores the count of the published posts.
82 // Let's use that for multisites.
83 if ( is_multisite() ) {
84 return 0 < (int) get_option( 'post_count' );
85 }
86
87 // On single sites we try our own cached option first.
88 $has_published_posts = get_option( 'wp_calendar_block_has_published_posts', null );
89 if ( null !== $has_published_posts ) {
90 return (bool) $has_published_posts;
91 }
92
93 // No cache hit, let's update the cache and return the cached value.
94 return gutenberg_block_core_calendar_update_has_published_posts();
95 }
96
97 /**
98 * Queries the database for any published post and saves
99 * a flag whether any published post exists or not.
100 *
101 * @return bool Has any published posts or not.
102 */
103 function gutenberg_block_core_calendar_update_has_published_posts() {
104 global $wpdb;
105 $has_published_posts = (bool) $wpdb->get_var( "SELECT 1 as test FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1" );
106 update_option( 'wp_calendar_block_has_published_posts', $has_published_posts );
107 return $has_published_posts;
108 }
109
110 // We only want to register these functions and actions when
111 // we are on single sites. On multi sites we use `post_count` option.
112 if ( ! is_multisite() ) {
113 /**
114 * Handler for updating the has published posts flag when a post is deleted.
115 *
116 * @param int $post_id Deleted post ID.
117 */
118 function gutenberg_block_core_calendar_update_has_published_post_on_delete( $post_id ) {
119 $post = get_post( $post_id );
120
121 if ( ! $post || 'publish' !== $post->post_status || 'post' !== $post->post_type ) {
122 return;
123 }
124
125 gutenberg_block_core_calendar_update_has_published_posts();
126 }
127
128 /**
129 * Handler for updating the has published posts flag when a post status changes.
130 *
131 * @param string $new_status The status the post is changing to.
132 * @param string $old_status The status the post is changing from.
133 * @param WP_Post $post Post object.
134 */
135 function gutenberg_block_core_calendar_update_has_published_post_on_transition_post_status( $new_status, $old_status, $post ) {
136 if ( $new_status === $old_status ) {
137 return;
138 }
139
140 if ( 'post' !== get_post_type( $post ) ) {
141 return;
142 }
143
144 if ( 'publish' !== $new_status && 'publish' !== $old_status ) {
145 return;
146 }
147
148 gutenberg_block_core_calendar_update_has_published_posts();
149 }
150
151 add_action( 'delete_post', 'gutenberg_block_core_calendar_update_has_published_post_on_delete' );
152 add_action( 'transition_post_status', 'gutenberg_block_core_calendar_update_has_published_post_on_transition_post_status', 10, 3 );
153 }
154