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( '', $extra_fields . '', $processed_content->get_updated_html() ); } /** * 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 .= ''; } 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' ) . '
', '' . get_bloginfo( 'name' ) . '' ); $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 ) . '
'; } // 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' ), $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 );