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