wp/wp-includes/blocks/comments.php
changeset 21 48c4eec2b7e6
equal deleted inserted replaced
20:7b1b88e27a20 21:48c4eec2b7e6
       
     1 <?php
       
     2 /**
       
     3  * Server-side rendering of the `core/comments` block.
       
     4  *
       
     5  * @package WordPress
       
     6  */
       
     7 
       
     8 /**
       
     9  * Renders the `core/comments` block on the server.
       
    10  *
       
    11  * This render callback is mainly for rendering a dynamic, legacy version of
       
    12  * this block (the old `core/post-comments`). It uses the `comments_template()`
       
    13  * function to generate the output, in the same way as classic PHP themes.
       
    14  *
       
    15  * As this callback will always run during SSR, first we need to check whether
       
    16  * the block is in legacy mode. If not, the HTML generated in the editor is
       
    17  * returned instead.
       
    18  *
       
    19  * @since 6.1.0
       
    20  *
       
    21  * @global WP_Post $post Global post object.
       
    22  *
       
    23  * @param array    $attributes Block attributes.
       
    24  * @param string   $content    Block default content.
       
    25  * @param WP_Block $block      Block instance.
       
    26  * @return string Returns the filtered post comments for the current post wrapped inside "p" tags.
       
    27  */
       
    28 function render_block_core_comments( $attributes, $content, $block ) {
       
    29 	global $post;
       
    30 
       
    31 	$post_id = $block->context['postId'];
       
    32 	if ( ! isset( $post_id ) ) {
       
    33 		return '';
       
    34 	}
       
    35 
       
    36 	// Return early if there are no comments and comments are closed.
       
    37 	if ( ! comments_open( $post_id ) && (int) get_comments_number( $post_id ) === 0 ) {
       
    38 		return '';
       
    39 	}
       
    40 
       
    41 	// If this isn't the legacy block, we need to render the static version of this block.
       
    42 	$is_legacy = 'core/post-comments' === $block->name || ! empty( $attributes['legacy'] );
       
    43 	if ( ! $is_legacy ) {
       
    44 		return $block->render( array( 'dynamic' => false ) );
       
    45 	}
       
    46 
       
    47 	$post_before = $post;
       
    48 	$post        = get_post( $post_id );
       
    49 	setup_postdata( $post );
       
    50 
       
    51 	ob_start();
       
    52 
       
    53 	/*
       
    54 	 * There's a deprecation warning generated by WP Core.
       
    55 	 * Ideally this deprecation is removed from Core.
       
    56 	 * In the meantime, this removes it from the output.
       
    57 	 */
       
    58 	add_filter( 'deprecated_file_trigger_error', '__return_false' );
       
    59 	comments_template();
       
    60 	remove_filter( 'deprecated_file_trigger_error', '__return_false' );
       
    61 
       
    62 	$output = ob_get_clean();
       
    63 	$post   = $post_before;
       
    64 
       
    65 	$classnames = array();
       
    66 	// Adds the old class name for styles' backwards compatibility.
       
    67 	if ( isset( $attributes['legacy'] ) ) {
       
    68 		$classnames[] = 'wp-block-post-comments';
       
    69 	}
       
    70 	if ( isset( $attributes['textAlign'] ) ) {
       
    71 		$classnames[] = 'has-text-align-' . $attributes['textAlign'];
       
    72 	}
       
    73 
       
    74 	$wrapper_attributes = get_block_wrapper_attributes(
       
    75 		array( 'class' => implode( ' ', $classnames ) )
       
    76 	);
       
    77 
       
    78 	/*
       
    79 	 * Enqueues scripts and styles required only for the legacy version. That is
       
    80 	 * why they are not defined in `block.json`.
       
    81 	 */
       
    82 	wp_enqueue_script( 'comment-reply' );
       
    83 	enqueue_legacy_post_comments_block_styles( $block->name );
       
    84 
       
    85 	return sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, $output );
       
    86 }
       
    87 
       
    88 /**
       
    89  * Registers the `core/comments` block on the server.
       
    90  *
       
    91  * @since 6.1.0
       
    92  */
       
    93 function register_block_core_comments() {
       
    94 	register_block_type_from_metadata(
       
    95 		__DIR__ . '/comments',
       
    96 		array(
       
    97 			'render_callback'   => 'render_block_core_comments',
       
    98 			'skip_inner_blocks' => true,
       
    99 		)
       
   100 	);
       
   101 }
       
   102 add_action( 'init', 'register_block_core_comments' );
       
   103 
       
   104 /**
       
   105  * Use the button block classes for the form-submit button.
       
   106  *
       
   107  * @since 6.1.0
       
   108  *
       
   109  * @param array $fields The default comment form arguments.
       
   110  *
       
   111  * @return array Returns the modified fields.
       
   112  */
       
   113 function comments_block_form_defaults( $fields ) {
       
   114 	if ( wp_is_block_theme() ) {
       
   115 		$fields['submit_button'] = '<input name="%1$s" type="submit" id="%2$s" class="%3$s wp-block-button__link ' . wp_theme_get_element_class_name( 'button' ) . '" value="%4$s" />';
       
   116 		$fields['submit_field']  = '<p class="form-submit wp-block-button">%1$s %2$s</p>';
       
   117 	}
       
   118 
       
   119 	return $fields;
       
   120 }
       
   121 add_filter( 'comment_form_defaults', 'comments_block_form_defaults' );
       
   122 
       
   123 /**
       
   124  * Enqueues styles from the legacy `core/post-comments` block. These styles are
       
   125  * required only by the block's fallback.
       
   126  *
       
   127  * @since 6.1.0
       
   128  *
       
   129  * @param string $block_name Name of the new block type.
       
   130  */
       
   131 function enqueue_legacy_post_comments_block_styles( $block_name ) {
       
   132 	static $are_styles_enqueued = false;
       
   133 
       
   134 	if ( ! $are_styles_enqueued ) {
       
   135 		$handles = array(
       
   136 			'wp-block-post-comments',
       
   137 			'wp-block-buttons',
       
   138 			'wp-block-button',
       
   139 		);
       
   140 		foreach ( $handles as $handle ) {
       
   141 			wp_enqueue_block_style( $block_name, array( 'handle' => $handle ) );
       
   142 		}
       
   143 		$are_styles_enqueued = true;
       
   144 	}
       
   145 }
       
   146 
       
   147 /**
       
   148  * Ensures backwards compatibility for any users running the Gutenberg plugin
       
   149  * who have used Post Comments before it was merged into Comments Query Loop.
       
   150  *
       
   151  * The same approach was followed when core/query-loop was renamed to
       
   152  * core/post-template.
       
   153  *
       
   154  * @since 6.1.0
       
   155  *
       
   156  * @see https://github.com/WordPress/gutenberg/pull/41807
       
   157  * @see https://github.com/WordPress/gutenberg/pull/32514
       
   158  */
       
   159 function register_legacy_post_comments_block() {
       
   160 	$registry = WP_Block_Type_Registry::get_instance();
       
   161 
       
   162 	/*
       
   163 	 * Remove the old `post-comments` block if it was already registered, as it
       
   164 	 * is about to be replaced by the type defined below.
       
   165 	 */
       
   166 	if ( $registry->is_registered( 'core/post-comments' ) ) {
       
   167 		unregister_block_type( 'core/post-comments' );
       
   168 	}
       
   169 
       
   170 	// Recreate the legacy block metadata.
       
   171 	$metadata = array(
       
   172 		'name'              => 'core/post-comments',
       
   173 		'category'          => 'theme',
       
   174 		'attributes'        => array(
       
   175 			'textAlign' => array(
       
   176 				'type' => 'string',
       
   177 			),
       
   178 		),
       
   179 		'uses_context'      => array(
       
   180 			'postId',
       
   181 			'postType',
       
   182 		),
       
   183 		'supports'          => array(
       
   184 			'html'       => false,
       
   185 			'align'      => array( 'wide', 'full' ),
       
   186 			'typography' => array(
       
   187 				'fontSize'                      => true,
       
   188 				'lineHeight'                    => true,
       
   189 				'__experimentalFontStyle'       => true,
       
   190 				'__experimentalFontWeight'      => true,
       
   191 				'__experimentalLetterSpacing'   => true,
       
   192 				'__experimentalTextTransform'   => true,
       
   193 				'__experimentalDefaultControls' => array(
       
   194 					'fontSize' => true,
       
   195 				),
       
   196 			),
       
   197 			'color'      => array(
       
   198 				'gradients'                     => true,
       
   199 				'link'                          => true,
       
   200 				'__experimentalDefaultControls' => array(
       
   201 					'background' => true,
       
   202 					'text'       => true,
       
   203 				),
       
   204 			),
       
   205 			'inserter'   => false,
       
   206 		),
       
   207 		'style'             => array(
       
   208 			'wp-block-post-comments',
       
   209 			'wp-block-buttons',
       
   210 			'wp-block-button',
       
   211 		),
       
   212 		'render_callback'   => 'render_block_core_comments',
       
   213 		'skip_inner_blocks' => true,
       
   214 	);
       
   215 
       
   216 	/*
       
   217 	 * Filters the metadata object, the same way it's done inside
       
   218 	 * `register_block_type_from_metadata()`. This applies some default filters,
       
   219 	 * like `_wp_multiple_block_styles`, which is required in this case because
       
   220 	 * the block has multiple styles.
       
   221 	 */
       
   222 	/** This filter is documented in wp-includes/blocks.php */
       
   223 	$metadata = apply_filters( 'block_type_metadata', $metadata );
       
   224 
       
   225 	register_block_type( 'core/post-comments', $metadata );
       
   226 }
       
   227 add_action( 'init', 'register_legacy_post_comments_block', 21 );