<?php /** * Form Ajax Handing. * * @package Kadence Blocks */ if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Main plugin class */ class KB_Ajax_Form { /** * Instance Control * * @var null */ private static $instance = null; /** * Instance Control */ public static function get_instance() { if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } /** * Class Constructor. */ public function __construct() { add_action( 'wp_ajax_kb_process_ajax_submit', array( $this, 'process_ajax' ) ); add_action( 'wp_ajax_nopriv_kb_process_ajax_submit', array( $this, 'process_ajax' ) ); } /** * Process the form submit. */ public function process_ajax() { if ( isset( $_POST['_kb_form_id'] ) && ! empty( $_POST['_kb_form_id'] ) && isset( $_POST['_kb_form_post_id'] ) && ! empty( $_POST['_kb_form_post_id'] ) ) { $this->start_buffer(); $valid = true; if ( apply_filters( 'kadence_blocks_form_verify_nonce', false ) ) { $valid = check_ajax_referer( 'kb_form_nonce', '_kb_form_verify', false ); } if ( $valid ) { // Lets get form data. $form_id = sanitize_text_field( wp_unslash( $_POST['_kb_form_id'] ) ); $post_id = sanitize_text_field( wp_unslash( $_POST['_kb_form_post_id'] ) ); $form_args = $this->get_form_args( $post_id, $form_id ); if ( ! $form_args ) { $this->process_bail( __( 'Submission Failed', 'kadence-blocks' ), __( 'Data not Found', 'kadence-blocks' ) ); } // Check for default form actions. if ( ! isset( $form_args['actions'] ) ) { $form_args['actions'] = array( 'email' ); } if ( ! isset( $form_args['email'] ) ) { $form_args['email'] = array( 0 => array( 'emailTo' => get_bloginfo( 'admin_email' ), 'subject' => '[' . get_bloginfo( 'name' ) . ' ' . __( 'Submission', 'kadence-blocks' ) . ']', 'replyTo' => 'email_field', 'html' => true, ), ); } // Check for Message strings. $messages = array( 0 => array( 'success' => esc_html__( 'Submission Success, Thanks for getting in touch!', 'kadence-blocks' ), 'error' => esc_html__( 'Submission Failed', 'kadence-blocks' ), 'recaptchaerror' => esc_html__( 'Submission Failed, reCaptcha spam prevention. Please reload your page and try again.', 'kadence-blocks' ), ), ); if ( isset( $form_args['messages'] ) && isset( $form_args['messages'][0] ) ) { if ( isset( $form_args['messages'][0]['recaptchaerror'] ) && ! empty( $form_args['messages'][0]['recaptchaerror'] ) ) { $messages[0]['recaptchaerror'] = $form_args['messages'][0]['recaptchaerror']; } if ( isset( $form_args['messages'][0]['success'] ) && ! empty( $form_args['messages'][0]['success'] ) ) { $messages[0]['success'] = $form_args['messages'][0]['success']; } if ( isset( $form_args['messages'][0]['error'] ) && ! empty( $form_args['messages'][0]['error'] ) ) { $messages[0]['error'] = $form_args['messages'][0]['error']; } if ( isset( $form_args['messages'][0]['required'] ) && ! empty( $form_args['messages'][0]['required'] ) ) { $messages[0]['required'] = $form_args['messages'][0]['required']; } if ( isset( $form_args['messages'][0]['invalid'] ) && ! empty( $form_args['messages'][0]['invalid'] ) ) { $messages[0]['invalid'] = $form_args['messages'][0]['invalid']; } } // Check Honey Pot. $honeypot_check_enabled = ! isset( $form_args['honeyPot'] ) || ( isset( $form_args['honeyPot'] ) && true === $form_args['honeyPot'] ); if ( $honeypot_check_enabled && isset( $_POST['_kb_verify_email'] ) ) { $honeypot_check = htmlspecialchars( $_POST['_kb_verify_email'], ENT_QUOTES ); if ( ! empty( $honeypot_check ) ) { $this->process_bail( __( 'Submission Rejected', 'kadence-blocks' ), __( 'Spam Detected', 'kadence-blocks' ) ); } } // Check Recaptcha. if ( isset( $form_args['recaptcha'] ) && true === $form_args['recaptcha'] ) { if ( isset( $form_args['recaptchaVersion'] ) && 'v2' === $form_args['recaptchaVersion'] ) { if ( ! isset( $_POST['g-recaptcha-response'] ) || empty( $_POST['g-recaptcha-response'] ) ) { $this->process_bail( $messages[0]['recaptchaerror'], __( 'reCAPTCHA Failed', 'kadence-blocks' ) ); } if ( ! $this->verify_recaptcha_v2( $_POST['g-recaptcha-response'] ) ) { $this->process_bail( $messages[0]['recaptchaerror'], __( 'reCAPTCHA Failed', 'kadence-blocks' ) ); } } else { if ( ! $this->verify_recaptcha( $_POST['recaptcha_response'] ) ) { $this->process_bail( $messages[0]['recaptchaerror'], __( 'reCAPTCHA Failed', 'kadence-blocks' ) ); } } unset( $_POST['recaptcha_response'] ); } unset( $_POST['_kb_form_sub_id'], $_POST['_kb_verify_email'] ); // Get fields. $fields = array(); if ( ! isset( $form_args['fields'] ) || ! is_array( $form_args['fields'] ) ) { $form_args['fields'] = array( 0 => array( 'label' => 'Name', 'showLabel' => true, 'placeholder' => '', 'default' => '', 'rows' => 4, 'options' => array(), 'multiSelect' => false, 'inline' => false, 'showLink' => false, 'min' => '', 'max' => '', 'type' => 'text', 'required' => false, 'width' => array( '100', '', '' ), 'auto' => '', ), 1 => array( 'label' => 'Email', 'showLabel' => true, 'placeholder' => '', 'default' => '', 'rows' => 4, 'options' => array(), 'multiSelect' => false, 'inline' => false, 'showLink' => false, 'min' => '', 'max' => '', 'type' => 'email', 'required' => true, 'width' => array( '100', '', '' ), 'auto' => '', ), 2 => array( 'label' => 'Message', 'showLabel' => true, 'placeholder' => '', 'default' => '', 'rows' => 4, 'options' => array(), 'multiSelect' => false, 'inline' => false, 'showLink' => false, 'min' => '', 'max' => '', 'type' => 'textarea', 'required' => true, 'width' => array( '100', '', '' ), 'auto' => '', ), ); } $privacy_title = ( get_option( 'wp_page_for_privacy_policy' ) ? get_the_title( get_option( 'wp_page_for_privacy_policy' ) ) : '' ); foreach ( $form_args['fields'] as $key => $data ) { // check for required. if ( $data['required'] && ( ! isset( $_POST[ 'kb_field_' . $key ] ) || empty( $_POST[ 'kb_field_' . $key ] ) ) ) { $this->process_bail( $messages[0]['error'], __( 'Required Field Empty', 'kadence-blocks' ), 'kb_field_' . $key ); } if ( isset( $_POST[ 'kb_field_' . $key ] ) ) { $fields[ $key ] = array( 'type' => $data['type'], 'label' => str_replace( '{privacy_policy}', $privacy_title, $data['label'] ), 'value' => $this->sanitize_field( $data['type'], wp_unslash( $_POST[ 'kb_field_' . $key ] ), $data['multiSelect'] ), ); if ( 'hidden' === $data['type'] ) { global $post; $refer_id = is_object( $post ) ? $post->ID : url_to_postid( wp_get_referer() ); $fields[ $key ]['value'] = str_replace( '{page_title}', get_the_title( $refer_id ), $fields[ $key ]['value'] ); $fields[ $key ]['value'] = str_replace( '{page_url}', wp_get_referer(), $fields[ $key ]['value'] ); $fields[ $key ]['value'] = str_replace( '{remoteip}', $_SERVER['REMOTE_ADDR'], $fields[ $key ]['value']); } unset( $_POST[ 'kb_field_' . $key ] ); } } $final_data = array( 'redirect' => false, ); foreach ( $form_args['actions'] as $data ) { switch ( $data ) { case 'email': $to = isset( $form_args['email'][0]['emailTo'] ) && ! empty( trim( $form_args['email'][0]['emailTo'] ) ) ? trim( $form_args['email'][0]['emailTo'] ) : get_option( 'admin_email' ); $subject = isset( $form_args['email'][0]['subject'] ) && ! empty( trim( $form_args['email'][0]['subject'] ) ) ? $form_args['email'][0]['subject'] : '[' . get_bloginfo( 'name' ) . ' ' . __( 'Submission', 'kadence-blocks' ) . ']'; if ( strpos( $subject, '{field_' ) !== false ) { preg_match_all( '/{field_(.*?)}/', $subject, $match ); if ( is_array( $match ) && isset( $match[1] ) && is_array( $match[1] ) ) { foreach ( $match[1] as $field_id ) { if ( isset( $field_id ) ) { $real_id = absint( $field_id ) - 1; if ( isset( $fields[ $real_id ] ) && is_array( $fields[ $real_id ] ) && isset( $fields[ $real_id ]['value'] ) ) { $subject = str_replace( '{field_' . $field_id . '}' , $fields[ $real_id ]['value'], $subject ); } } } } } if ( strpos( $subject, '{page_title}' ) !== false ) { global $post; $refer_id = is_object( $post ) ? $post->ID : url_to_postid( wp_get_referer() ); $subject = str_replace( '{page_title}', get_the_title( $refer_id ), $subject ); } $email_content = ''; $reply_email = false; foreach ( $fields as $key => $data ) { if ( 'email' === $data['type'] ) { $reply_email = $data['value']; } } if ( isset( $form_args['email'][0]['replyTo'] ) && 'from_email' === $form_args['email'][0]['replyTo'] ) { $reply_email = isset( $form_args['email'][0]['fromEmail'] ) && ! empty( trim( $form_args['email'][0]['fromEmail'] ) ) ? sanitize_email( trim( $form_args['email'][0]['fromEmail'] ) ) : false; } if ( $form_args['email'][0]['html'] ) { $args = array( 'fields' => $fields ); $email_content = kadence_blocks_get_template_html( 'form-email.php', $args ); } else { foreach ( $fields as $key => $data ) { if ( is_array( $data['value'] ) ) { $data['value'] = explode( ', ', $data['value'] ); } $email_content .= $data['label'] . ': ' . $data['value'] . "\n\n"; } } $body = $email_content; if ( $form_args['email'][0]['html'] ) { $headers = 'Content-Type: text/html; charset=UTF-8' . "\r\n"; } else { $headers = 'Content-Type: text/plain; charset=UTF-8' . "\r\n"; } if ( $reply_email ) { $headers .= 'Reply-To: <' . $reply_email . '>' . "\r\n"; } if ( isset( $form_args['email'][0]['fromEmail'] ) && ! empty( trim( $form_args['email'][0]['fromEmail'] ) ) ) { $from_name = ( isset( $form_args['email'][0]['fromName'] ) && ! empty( trim( $form_args['email'][0]['fromName'] ) ) ? trim( $form_args['email'][0]['fromName'] ) . ' ' : '' ); if ( strpos( $from_name, '{field_' ) !== false ) { preg_match_all( '/{field_(.*?)}/', $from_name, $match ); if ( is_array( $match ) && isset( $match[1] ) && is_array( $match[1] ) ) { foreach ( $match[1] as $field_id ) { if ( isset( $field_id ) ) { $real_id = absint( $field_id ) - 1; if ( isset( $fields[ $real_id ] ) && is_array( $fields[ $real_id ] ) && isset( $fields[ $real_id ]['value'] ) ) { $from_name = str_replace( '{field_' . $field_id . '}' , $fields[ $real_id ]['value'], $from_name ); } } } } } $headers .= 'From: ' . $from_name . '<' . sanitize_email( trim( $form_args['email'][0]['fromEmail'] ) ) . '>' . "\r\n"; } $cc_headers = ''; if ( isset( $form_args['email'][0]['cc'] ) && ! empty( trim( $form_args['email'][0]['cc'] ) ) ) { $cc_headers = 'Cc: ' . sanitize_email( trim( $form_args['email'][0]['cc'] ) ) . "\r\n"; } wp_mail( $to, $subject, $body, $headers . $cc_headers ); if ( isset( $form_args['email'][0]['bcc'] ) && ! empty( trim( $form_args['email'][0]['bcc'] ) ) ) { $bcc_emails = explode( ',', $form_args['email'][0]['bcc'] ); foreach ( $bcc_emails as $bcc_email ) { wp_mail( sanitize_email( trim( $bcc_email ) ), $subject, $body, $headers ); } } break; case 'redirect': if ( isset( $form_args['redirect'] ) && ! empty( trim( $form_args['redirect'] ) ) ) { $final_data['redirect'] = apply_filters( 'kadence_blocks_form_redirect', trim( $form_args['redirect'] ), $form_args, $fields, $form_id, $post_id ); } break; case 'mailerlite': $api_key = get_option( 'kadence_blocks_mailerlite_api' ); if ( empty( $api_key ) ) { return; } $mailerlite_default = array( 'map' => array(), 'groupe' => '', ); $mailerlite_args = ( isset( $form_args['mailerlite'] ) && is_array( $form_args['mailerlite'] ) && isset( $form_args['mailerlite'][0] ) && is_array( $form_args['mailerlite'][0] ) ? $form_args['mailerlite'][0] : $mailerlite_default ); $groups = ( isset( $mailerlite_args['group'] ) ? $mailerlite_args['group'] : array() ); $map = ( isset( $mailerlite_args['map'] ) && is_array( $mailerlite_args['map'] ) ? $mailerlite_args['map'] : array() ); $body = array( 'fields' => array(), ); $email = false; if ( ! empty( $map ) ) { foreach ( $fields as $key => $data ) { if ( isset( $map[ $key ] ) && ! empty( $map[ $key ] ) ) { if ( 'email' === $map[ $key ] && ! $email ) { $email = $data['value']; $body['email'] = $data['value']; } else { $body['fields'][ $map[ $key ] ] = $data['value']; } } } } else { foreach ( $fields as $key => $data ) { if ( 'email' === $data['type'] ) { $email = $data['value']; $body['email'] = $data['value']; break; } } } if ( empty( $body['fields'] ) ) { unset( $body['fields'] ); } if ( ! empty( $groups ) && is_array( $groups ) && isset( $groups[0] ) && ! empty( $groups[0] ) ) { $group_id = $groups[0]; } $body['resubscribe'] = true; if ( isset( $body[ 'email' ] ) ) { if ( strlen( $api_key ) > 100 ) { // New connect API. $api_url = 'https://connect.mailerlite.com/api/subscribers'; if ( ! empty( $group_id ) ) { $body['groups'] = array( strval( $group_id ) ); } $auth = 'Authorization'; $api_key = 'Bearer ' . $api_key; } else { if ( ! empty( $group_id ) ) { $api_url = 'https://api.mailerlite.com/api/v2/groups/' . $group_id . '/subscribers'; } else { $api_url = 'https://api.mailerlite.com/api/v2/subscribers'; } $auth = 'X-MailerLite-ApiKey'; } $response = wp_remote_post( $api_url, array( 'method' => 'POST', 'timeout' => 15, 'headers' => array( 'accept' => 'application/json', 'content-type' => 'application/json', $auth => $api_key, ), 'body' => json_encode( $body ), ) ); if ( is_wp_error( $response ) ) { $error_message = $response->get_error_message(); error_log( "Something went wrong: $error_message" ); } else { if ( ! isset( $response['response'] ) || ! isset( $response['response']['code'] ) ) { error_log( __( 'No Response from MailerLite', 'kadence-blocks' ) ); } if ( 400 === $response['response']['code'] ) { error_log( print_r( $response['response'], true ) ); $this->process_bail( $response['response']['message'] . ' ' . __( 'MailerLite Misconfiguration', 'kadence-blocks' ), __( 'MailerLite Failed', 'kadence-blocks' ) ); } } } break; case 'fluentCRM': $fluentcrm_default = array( 'map' => array(), 'lists' => array(), 'tags' => array(), 'doubleOptin' => false, ); $fluentcrm_args = ( isset( $form_args['fluentcrm'] ) && is_array( $form_args['fluentcrm'] ) && isset( $form_args['fluentcrm'][0] ) && is_array( $form_args['fluentcrm'][0] ) ? $form_args['fluentcrm'][0] : $fluentcrm_default ); $map = ( isset( $fluentcrm_args['map'] ) && is_array( $fluentcrm_args['map'] ) ? $fluentcrm_args['map'] : array() ); $double_optin = ( isset( $fluentcrm_args['doubleOptin'] ) ? $fluentcrm_args['doubleOptin'] : false ); $fluent_data = array(); $lists = ( isset( $fluentcrm_args['lists'] ) ? $fluentcrm_args['lists'] : array() ); $tags = ( isset( $fluentcrm_args['tags'] ) ? $fluentcrm_args['tags'] : array() ); if ( $double_optin ) { $fluent_data['status'] = 'pending'; } else { $fluent_data['status'] = 'subscribed'; } if ( ! empty( $lists ) ) { $fluent_data['lists'] = array(); foreach ( $lists as $key => $data ) { $fluent_data['lists'][] = $data['value']; } } if ( ! empty( $tags ) ) { $fluent_data['tags'] = array(); foreach ( $tags as $key => $data ) { $fluent_data['tags'][] = $data['value']; } } $email = false; if ( ! empty( $map ) ) { foreach ( $fields as $key => $data ) { if ( isset( $map[ $key ] ) && ! empty( $map[ $key ] ) ) { if ( 'email' === $map[ $key ] && ! $email ) { $email = $data['value']; $fluent_data['email'] = $data['value']; } else { $fluent_data[ $map[ $key ] ] = $data['value']; } } } } else { foreach ( $fields as $key => $data ) { if ( 'email' === $data['type'] ) { $fluent_data['email'] = $data['value']; break; } } } if ( isset( $fluent_data['email'] ) && ! empty( $fluent_data['email'] ) && function_exists( 'FluentCrmApi' ) ) { $contact_api = FluentCrmApi( 'contacts' ); $contact = $contact_api->createOrUpdate( $fluent_data ); if ( $double_optin && 'pending' === $contact->status ) { $contact->sendDoubleOptinEmail(); } } break; } } do_action( 'kadence_blocks_form_submission', $form_args, $fields, $form_id, $post_id ); $success = apply_filters( 'kadence_blocks_form_submission_success', true, $form_args, $fields, $form_id, $post_id ); $messages = apply_filters( 'kadence_blocks_form_submission_messages', $messages ); if ( ! $success ) { $this->process_bail( $messages[0]['error'], __( 'Third Party Failed', 'kadence-blocks' ) ); } else { $final_data['html'] = '<div class="kadence-blocks-form-message kadence-blocks-form-success">' . $messages[0]['success'] . '</div>'; $this->send_json( $final_data ); } } else { $this->process_bail( __( 'Submission rejected, invalid security token. Reload the page and try again.', 'kadence-blocks' ), __( 'Token invalid', 'kadence-blocks' ) ); } } else { $this->process_bail( __( 'Submission failed', 'kadence-blocks' ), __( 'No Data', 'kadence-blocks' ) ); } } /** * Sanitize the field * * @param string $field_type the field type. * @param mixed $value the field value. */ private function sanitize_field( $field_type, $value, $multi_select = false ) { switch ( $field_type ) { case 'text': case 'tel': case 'password': case 'hidden': case 'search': case 'select': $value = ( $multi_select && is_array( $value ) ? sanitize_text_field( implode( ', ', $value ) ) : sanitize_text_field( $value ) ); break; case 'checkbox': $value = ( is_array( $value ) ? sanitize_text_field( implode( ', ', $value ) ) : sanitize_text_field( $value ) ); break; case 'radio': $value = ( is_array( $value ) ? sanitize_text_field( implode( ', ', $value ) ) : sanitize_text_field( $value ) ); break; case 'url': $value = esc_url_raw( trim( $value ) ); break; case 'textarea': $value = sanitize_textarea_field( $value ); break; case 'email': $value = sanitize_email( trim( $value ) ); break; case 'accept': $value = esc_html__( 'Accept', 'kadence-blocks' ); break; default: /** * Sanitize field value. * Filters the value of the form field for sanitization purpose. * The dynamic portion of the hook name, `$field_type`, refers to the field type. * * @param string $value The field value. */ $value = apply_filters( "kadence_blocks_form_sanitize_{$field_type}", $value ); } return $value; } /** * Bail out something isn't correct. * * @param string $error Error to display. * @param string $note Note to show in console. * @param string $action action to take if any. */ public function process_bail( $error, $note, $required = null ) { $notices = array(); $notices['error']['note'] = $error; $out = array( 'html' => $this->html_from_notices( $notices ), 'console' => $note, 'required' => $required, ); $this->send_json( $out, true ); } /** * Check Recaptcha * * @param string $token Recaptcha token. * * @return bool */ private function verify_recaptcha( $token ) { $recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify'; $secret = get_option( 'kadence_blocks_recaptcha_secret_key' ); if ( ! $secret ) { return false; } $args = array( 'body' => array( 'secret' => $secret, 'response' => $token, ), ); $verify_request = wp_remote_post( $recaptcha_url, $args ); if ( is_wp_error( $verify_request ) ) { return false; } $response = wp_remote_retrieve_body( $verify_request ); if ( is_wp_error( $response ) ) { return false; } $response = json_decode( $response, true ); if ( ! isset( $response['success'] ) ) { return false; } return $response['success']; } /** * Check Recaptcha V2 * * @param string $token Recaptcha token. * * @return bool */ private function verify_recaptcha_v2( $token ) { $recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify'; $secret = get_option( 'kadence_blocks_recaptcha_secret_key' ); if ( ! $secret ) { return false; } $args = array( 'body' => array( 'secret' => $secret, 'response' => $token, 'remoteip' => $_SERVER['REMOTE_ADDR'], ), ); $verify_request = wp_remote_post( $recaptcha_url, $args ); if ( is_wp_error( $verify_request ) ) { return false; } $response = wp_remote_retrieve_body( $verify_request ); if ( is_wp_error( $response ) ) { return false; } $response = json_decode( $response, true ); if ( ! isset( $response['success'] ) ) { return false; } if ( isset( $response['success'] ) && true === $response['success'] ) { return $response['success']; } if ( isset( $response['error-codes'] ) && is_array( $response['error-codes'] ) ) { if ( isset( $response['error-codes'][0] ) && $response['error-codes'][0] === 'timeout-or-duplicate' ) { return true; } } return false; } /** * Create HTML string from notices * * @param array $notices Notices to display. * * @return string */ public function html_from_notices( $notices = array() ) { $html = ''; foreach ( $notices as $note_type => $notice ) { if ( ! empty( $notice['note'] ) ) { $html .= '<div class="kadence-blocks-form-message kadence-blocks-form-warning">' . $notice['note'] . '</div>'; } } return $html; } /** * Starts a flushable buffer */ public function start_buffer() { if ( ! did_action( 'kadence_blocks_forms_buffer_started' ) ) { ob_start(); /** * Runs when buffer is started * * Used to prevent starting buffer twice */ do_action( 'kadence_blocks_forms_buffer_started' ); } } /** * Wrapper for wp_send_json() with output buffering * * @since 1.8.0 * * @param array $data Data to return * @param bool $is_error Optional. Is this an error. Default false. */ public function send_json( $data = array(), $is_error = false ) { $buffer = ob_get_clean(); /** * Runs before Kadence Blocks Forms returns json via wp_send_json() exposes output buffer * * @param string|null $buffer Buffer contents * @param bool $is_error If we think this is an error response or not. */ do_action( 'kadence_blocks_forms_buffer_flushed', $buffer, $is_error ); $data['headers_sent'] = headers_sent(); if ( ! $is_error ) { //status_header( 200 ); $data['success'] = true; $data['show_message'] = true; wp_send_json( $data ); } else { wp_send_json_error( $data ); } } /** * Get form args * * @param string $content the post content. */ public function parse_blocks( $content ) { $parser_class = apply_filters( 'block_parser_class', 'WP_Block_Parser' ); if ( class_exists( $parser_class ) ) { $parser = new $parser_class(); return $parser->parse( $content ); } elseif ( function_exists( 'gutenberg_parse_blocks' ) ) { return gutenberg_parse_blocks( $content ); } else { return false; } } /** * Get form args * * @param integer $post_id the form post id. * @param string $form_id the form id. */ private function get_form_args( $post_id, $form_id ) { $form_args = false; $blocks = ''; if ( strpos( $post_id, 'block-unknown' ) !== false ) { $widget_data = get_option( 'widget_block' ); if ( is_array( $widget_data ) ) { foreach ( $widget_data as $key => $data_array ) { if ( ! empty( $data_array['content'] ) && strpos( $data_array['content'], '<!-- wp:kadence/form {"uniqueID":"' . $form_id . '"' ) !== false ) { $blocks = $this->parse_blocks( $data_array['content'] ); break; } } } } else if ( strpos( $post_id, 'block' ) !== false ) { $widget_data = get_option( 'widget_block' ); $post_id_int = preg_replace( '/[^0-9]/', '', $post_id ); if ( ! empty( $widget_data[ absint( $post_id_int ) ] ) ) { $form_content = $widget_data[ absint( $post_id_int ) ]; $blocks = $this->parse_blocks( $form_content['content'] ); } } else { $post_data = get_post( absint( $post_id ) ); if ( is_object( $post_data ) ) { $blocks = $this->parse_blocks( $post_data->post_content ); } } if ( ! is_array( $blocks ) || empty( $blocks ) ) { $this->process_bail( __( 'Submission Failed', 'kadence-blocks' ), __( 'Data not found', 'kadence-blocks' ) ); } foreach ( $blocks as $indexkey => $block ) { if ( ! is_object( $block ) && is_array( $block ) && isset( $block['blockName'] ) ) { if ( 'kadence/form' === $block['blockName'] ) { if ( isset( $block['attrs'] ) && is_array( $block['attrs'] ) && isset( $block['attrs']['uniqueID'] ) && $form_id === $block['attrs']['uniqueID'] ) { $form_args = $block['attrs']; break; } } if ( isset( $block['innerBlocks'] ) && ! empty( $block['innerBlocks'] ) && is_array( $block['innerBlocks'] ) ) { $form_args = $this->parse_inner_blocks( $block['innerBlocks'], $form_id ); if ( $form_args ) { break; } } if ( 'core/block' === $block['blockName'] ) { if ( isset( $block['attrs'] ) && is_array( $block['attrs'] ) ) { $blockattr = $block['attrs']; if ( isset( $blockattr['ref'] ) ) { $reusable_block = get_post( $blockattr['ref'] ); if ( $reusable_block && 'wp_block' == $reusable_block->post_type ) { $reuse_data_block = $this->parse_blocks( $reusable_block->post_content ); $form_args = $this->parse_inner_blocks( $reuse_data_block, $form_id ); if ( $form_args ) { break; } } } } } } } return $form_args; } /** * Get form args * * @param array $blocks the post inner blocks. * @param string $form_id the form Id. */ private function parse_inner_blocks( $blocks, $form_id ) { $form_args = false; foreach ( $blocks as $indexkey => $block ) { if ( 'kadence/form' === $block['blockName'] ) { if ( isset( $block['attrs'] ) && is_array( $block['attrs'] ) && isset( $block['attrs']['uniqueID'] ) && $form_id === $block['attrs']['uniqueID'] ) { $form_args = $block['attrs']; break; } } if ( isset( $block['innerBlocks'] ) && ! empty( $block['innerBlocks'] ) && is_array( $block['innerBlocks'] ) ) { $form_args = $this->parse_inner_blocks( $block['innerBlocks'], $form_id ); if ( $form_args ) { break; } } if ( 'core/block' === $block['blockName'] ) { if ( isset( $block['attrs'] ) && is_array( $block['attrs'] ) ) { $blockattr = $block['attrs']; if ( isset( $blockattr['ref'] ) ) { $reusable_block = get_post( $blockattr['ref'] ); if ( $reusable_block && 'wp_block' == $reusable_block->post_type ) { $reuse_data_block = $this->parse_blocks( $reusable_block->post_content ); $form_args = $this->parse_inner_blocks( $reuse_data_block, $form_id ); if ( $form_args ) { break; } } } } } } return $form_args; } } KB_Ajax_Form::get_instance();