<?php
/**
* Server-side rendering of the `core/form` block.
*
* @package WordPress
*/
/**
* Renders the `core/form` block on server.
*
* @param array $attributes The block attributes.
* @param string $content The saved content.
*
* @return string The content of the block being rendered.
*/
function gutenberg_render_block_core_form( $attributes, $content ) {
$processed_content = new WP_HTML_Tag_Processor( $content );
$processed_content->next_tag( 'form' );
// Get the action for this form.
$action = '';
if ( isset( $attributes['action'] ) ) {
$action = str_replace(
array( '{SITE_URL}', '{ADMIN_URL}' ),
array( site_url(), admin_url() ),
$attributes['action']
);
}
$processed_content->set_attribute( 'action', esc_attr( $action ) );
// Add the method attribute. If it is not set, default to `post`.
$method = empty( $attributes['method'] ) ? 'post' : $attributes['method'];
$processed_content->set_attribute( 'method', $method );
$extra_fields = apply_filters( 'render_block_core_form_extra_fields', '', $attributes );
return str_replace(
'</form>',
$extra_fields . '</form>',
$processed_content->get_updated_html()
);
}
/**
* Additional data to add to the view.js script for this block.
*/
function gutenberg_block_core_form_view_script() {
if ( ! gutenberg_is_experiment_enabled( 'gutenberg-form-blocks' ) ) {
return;
}
wp_localize_script(
'wp-block-form-view',
'wpBlockFormSettings',
array(
'nonce' => wp_create_nonce( 'wp-block-form' ),
'ajaxUrl' => admin_url( 'admin-ajax.php' ),
'action' => 'wp_block_form_email_submit',
)
);
}
add_action( 'wp_enqueue_scripts', 'gutenberg_block_core_form_view_script' );
/**
* Adds extra fields to the form.
*
* If the form is a comment form, adds the post ID as a hidden field,
* to allow the comment to be associated with the post.
*
* @param string $extra_fields The extra fields.
* @param array $attributes The block attributes.
*
* @return string The extra fields.
*/
function gutenberg_block_core_form_extra_fields_comment_form( $extra_fields, $attributes ) {
if ( ! empty( $attributes['action'] ) && str_ends_with( $attributes['action'], '/wp-comments-post.php' ) ) {
$extra_fields .= '<input type="hidden" name="comment_post_ID" value="' . get_the_ID() . '" id="comment_post_ID">';
}
return $extra_fields;
}
add_filter( 'render_block_core_form_extra_fields', 'gutenberg_block_core_form_extra_fields_comment_form', 10, 2 );
/**
* Sends an email if the form is a contact form.
*/
function gutenberg_block_core_form_send_email() {
check_ajax_referer( 'wp-block-form' );
// Get the POST data.
$params = wp_unslash( $_POST );
// Start building the email content.
$content = sprintf(
/* translators: %s: The request URI. */
__( 'Form submission from %1$s', 'gutenberg' ) . '</br>',
'<a href="' . esc_url( get_site_url( null, $params['_wp_http_referer'] ) ) . '">' . get_bloginfo( 'name' ) . '</a>'
);
$skip_fields = array( 'formAction', '_ajax_nonce', 'action', '_wp_http_referer' );
foreach ( $params as $key => $value ) {
if ( in_array( $key, $skip_fields, true ) ) {
continue;
}
$content .= sanitize_key( $key ) . ': ' . wp_kses_post( $value ) . '</br>';
}
// Filter the email content.
$content = apply_filters( 'render_block_core_form_email_content', $content, $params );
// Send the email.
$result = wp_mail(
str_replace( 'mailto:', '', $params['formAction'] ),
__( 'Form submission', 'gutenberg' ),
$content
);
if ( ! $result ) {
wp_send_json_error( $result );
}
wp_send_json_success( $result );
}
add_action( 'wp_ajax_wp_block_form_email_submit', 'gutenberg_block_core_form_send_email' );
add_action( 'wp_ajax_nopriv_wp_block_form_email_submit', 'gutenberg_block_core_form_send_email' );
/**
* Send the data export/remove request if the form is a privacy-request form.
*/
function gutenberg_block_core_form_privacy_form() {
// Get the POST data.
$params = wp_unslash( $_POST );
// Bail early if not a form submission, or if the nonce is not valid.
if ( empty( $params['wp-action'] )
|| 'wp_privacy_send_request' !== $params['wp-action']
|| empty( $params['wp-privacy-request'] )
|| '1' !== $params['wp-privacy-request']
|| empty( $params['email'] )
) {
return;
}
// Get the request types.
$request_types = _wp_privacy_action_request_types();
$requests_found = array();
foreach ( $request_types as $request_type ) {
if ( ! empty( $params[ $request_type ] ) ) {
$requests_found[] = $request_type;
}
}
// Bail early if no requests were found.
if ( empty( $requests_found ) ) {
return;
}
// Process the requests.
$actions_errored = array();
$actions_performed = array();
foreach ( $requests_found as $action_name ) {
// Get the request ID.
$request_id = wp_create_user_request( $params['email'], $action_name );
// Bail early if the request ID is invalid.
if ( is_wp_error( $request_id ) ) {
$actions_errored[] = $action_name;
continue;
}
// Send the request email.
wp_send_user_request( $request_id );
$actions_performed[] = $action_name;
}
/**
* Determine whether the core/form-submission-notification block should be shown.
*
* @param bool $show Whether to show the core/form-submission-notification block.
* @param array $attributes The block attributes.
*
* @return bool Whether to show the core/form-submission-notification block.
*/
$show_notification = static function ( $show, $attributes ) use ( $actions_performed, $actions_errored ) {
switch ( $attributes['type'] ) {
case 'success':
return ! empty( $actions_performed ) && empty( $actions_errored );
case 'error':
return ! empty( $actions_errored );
default:
return $show;
}
};
// Add filter to show the core/form-submission-notification block.
add_filter( 'show_form_submission_notification_block', $show_notification, 10, 2 );
}
add_action( 'wp', 'gutenberg_block_core_form_privacy_form' );
/**
* Registers the `core/form` block on server.
*/
function gutenberg_register_block_core_form() {
if ( ! gutenberg_is_experiment_enabled( 'gutenberg-form-blocks' ) ) {
return;
}
register_block_type_from_metadata(
__DIR__ . '/form',
array(
'render_callback' => 'gutenberg_render_block_core_form',
)
);
}
add_action( 'init', 'gutenberg_register_block_core_form', 20 );