form()->config()['settings']['webhooks'] ?? [] ); if ( !$urls || !in_array( $submission->status(), [ 'success', 'failed' ], true ) || $submission->is_demo() ) { return; } $body = wp_json_encode( self::payload( $submission ) ); foreach ( $urls as $url ) { // Not to the site's own network: WordPress refuses local and private addresses (developers can allow one with // its http_request_host_is_external filter) wp_safe_remote_post( $url, [ 'blocking' => false, 'timeout' => 5, 'headers' => [ 'Content-Type' => 'application/json' ], 'body' => $body, ] ); } } /** * What a webhook receives * * @param Submission $submission Submission * * @return array */ public static function payload( Submission $submission ) { $form = $submission->form(); $hidden = Conditions::hidden_fields( $form, $submission->hidden_groups() ); $fields = []; $raw = []; foreach ( $form->fields() as $name => $field ) { $type = FieldRegistry::get( $field['type'] ); if ( !$type || !$type->submits() || in_array( $name, $hidden, true ) ) { continue; } // A repeated group's fields come as its rows: "rows": [ { "phone": "…" }, … ] $group = Repeater::of( $form, $name ); if ( $group ) { $fields[ $group ] = $fields[ $group ] ?? $submission->rows( $group ); $raw[ $group ] = $raw[ $group ] ?? $submission->rows( $group, true ); continue; } $fields[ $name ] = $submission->text( $name ); $raw[ $name ] = $submission->text( $name, true ); } return (array) apply_filters( 'remaily_webhook_payload', [ 'form' => [ 'id' => $form->id(), 'title' => $form->title() ], 'entry' => Entries::last(), 'fields' => $fields, 'raw' => $raw, 'meta' => [ 'url' => $submission->meta( 'url' ), 'ip' => Entries::stored_ip( (string) $submission->meta( 'ip' ) ), 'user_agent' => Entries::stored_agent( (string) $submission->meta( 'user_agent' ) ), 'user_id' => $submission->meta( 'user_id' ), 'utm' => (object) $submission->meta( 'utm' ), ], 'date' => gmdate( 'c', $submission->meta( 'time' ) ), ], $submission ); } }