[ Index ] |
PHP Cross Reference of WordPress Trunk (Updated Daily) |
[Summary view] [Print] [Text view]
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 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 ( ! 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 = wp_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 register_block_core_calendar() { 88 register_block_type_from_metadata( 89 __DIR__ . '/calendar', 90 array( 91 'render_callback' => 'render_block_core_calendar', 92 ) 93 ); 94 } 95 96 add_action( 'init', 'register_block_core_calendar' ); 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 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 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 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 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 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 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 block_core_calendar_update_has_published_posts(); 185 } 186 187 add_action( 'delete_post', 'block_core_calendar_update_has_published_post_on_delete' ); 188 add_action( 'transition_post_status', 'block_core_calendar_update_has_published_post_on_transition_post_status', 10, 3 ); 189 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated : Thu Nov 21 08:20:01 2024 | Cross-referenced by PHPXref |