: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
if ( strpos( $form_field['format'], 'middle' ) !== false ) {
'id' => $form_field['id'],
'type' => $form_field['type'],
'provider_type' => $form_field_type,
/* translators: %s - Name field label. */
esc_html__( '%s (Middle)', 'wpforms-lite' ),
if ( strpos( $form_field['format'], 'last' ) !== false ) {
'id' => $form_field['id'],
'type' => $form_field['type'],
'provider_type' => $form_field_type,
/* translators: %s - Name field label. */
esc_html__( '%s (Last)', 'wpforms-lite' ),
'id' => $form_field['id'],
'type' => $form_field['type'],
'provider_type' => $form_field_type,
'label' => $form_field['label'],
/************************************************************************
* API methods - these methods interact directly with the provider API. *
************************************************************************/
* Authenticate with the provider API.
* @return mixed id or error object
public function api_auth( $data = [], $form_id = '' ) {
* Establish connection object to provider API.
* @param string $account_id
* @return mixed array or error object
public function api_connect( $account_id ) {
* Retrieve provider account lists.
* @param string $connection_id
* @param string $account_id
* @return mixed array or error object
public function api_lists( $connection_id = '', $account_id = '' ) {
* Retrieve provider account list groups.
* @param string $connection_id
* @param string $account_id
* @return mixed array or error object
public function api_groups( $connection_id = '', $account_id = '', $list_id = '' ) {
* Retrieve provider account list fields.
* @param string $connection_id
* @param string $account_id
* @return mixed array or error object
public function api_fields( $connection_id = '', $account_id = '', $list_id = '' ) {
/*************************************************************************
* Output methods - these methods generally return HTML for the builder. *
*************************************************************************/
* This method compiles all the HTML necessary for a connection to a provider.
* @param string $connection_id
* @param array $connection
* @param mixed $form Form id or form data.
public function output_connection( $connection_id = '', $connection = [], $form = '' ) {
if ( empty( $connection_id ) ) {
$connection_id = 'connection_' . uniqid();
if ( empty( $connection ) || empty( $form ) ) {
$output = sprintf( '<div class="wpforms-provider-connection" data-provider="%s" data-connection_id="%s">', $this->slug, $connection_id );
$output .= $this->output_connection_header( $connection_id, $connection );
$output .= $this->output_auth();
$output .= $this->output_accounts( $connection_id, $connection );
$lists = $this->output_lists( $connection_id, $connection );
$output .= ! is_wp_error( $lists ) ? $lists : '';
$output .= $this->output_groups( $connection_id, $connection );
$fields = $this->output_fields( $connection_id, $connection, $form );
$output .= ! is_wp_error( $fields ) ? $fields : '';
$output .= $this->output_conditionals( $connection_id, $connection, $form );
$output .= $this->output_options( $connection_id, $connection );
* Connection header HTML.
* @param string $connection_id
* @param array $connection
public function output_connection_header( $connection_id = '', $connection = [] ) {
if ( empty( $connection_id ) || empty( $connection ) ) {
$output = '<div class="wpforms-provider-connection-header">';
$output .= sprintf( '<span>%s</span>', sanitize_text_field( $connection['connection_name'] ) );
$output .= '<button class="wpforms-provider-connection-delete"><i class="fa fa-trash-o"></i></button>';
$output .= sprintf( '<input type="hidden" name="providers[%s][%s][connection_name]" value="%s">', $this->slug, $connection_id, esc_attr( $connection['connection_name'] ) );
* Provider account authorize fields HTML.
public function output_auth() {
* Provider account select HTML.
* @param string $connection_id Unique connection ID.
* @param array $connection Array of connection data.
public function output_accounts( $connection_id = '', $connection = [] ) {
if ( empty( $connection_id ) || empty( $connection ) ) {
$providers = wpforms_get_providers_options();
if ( empty( $providers[ $this->slug ] ) ) {
$output = '<div class="wpforms-provider-accounts wpforms-connection-block">';
$output .= sprintf( '<h4>%s</h4>', esc_html__( 'Select Account', 'wpforms-lite' ) );
$output .= sprintf( '<select name="providers[%s][%s][account_id]">', $this->slug, $connection_id );
foreach ( $providers[ $this->slug ] as $key => $provider_details ) {
$selected = ! empty( $connection['account_id'] ) ? $connection['account_id'] : '';
'<option value="%s" %s>%s</option>',
selected( $selected, $key, false ),
esc_html( $provider_details['label'] )
$output .= sprintf( '<option value="">%s</a>', esc_html__( 'Add New Account', 'wpforms-lite' ) );
* Provider account lists HTML.
* @param string $connection_id
* @param array $connection
* @return WP_Error|string
public function output_lists( $connection_id = '', $connection = [] ) {
if ( empty( $connection_id ) || empty( $connection['account_id'] ) ) {
$lists = $this->api_lists( $connection_id, $connection['account_id'] );
$selected = ! empty( $connection['list_id'] ) ? $connection['list_id'] : '';
if ( is_wp_error( $lists ) ) {
$output = '<div class="wpforms-provider-lists wpforms-connection-block">';
$output .= sprintf( '<h4>%s</h4>', esc_html__( 'Select List', 'wpforms-lite' ) );
$output .= sprintf( '<select name="providers[%s][%s][list_id]">', $this->slug, $connection_id );
if ( ! empty( $lists ) ) {
foreach ( $lists as $list ) {
'<option value="%s" %s>%s</option>',
selected( $selected, $list['id'], false ),
esc_attr( $list['name'] )
* Provider account list groups HTML.
* @param string $connection_id
* @param array $connection
public function output_groups( $connection_id = '', $connection = [] ) {
if ( empty( $connection_id ) || empty( $connection['account_id'] ) || empty( $connection['list_id'] ) ) {
$groupsets = $this->api_groups( $connection_id, $connection['account_id'], $connection['list_id'] );
if ( is_wp_error( $groupsets ) ) {
$output = '<div class="wpforms-provider-groups wpforms-connection-block">';
$output .= sprintf( '<h4>%s</h4>', esc_html__( 'Select Groups', 'wpforms-lite' ) );
$output .= sprintf( '<p>%s</p>', esc_html__( 'We also noticed that you have some segments in your list. You can select specific list segments below if needed. This is optional.', 'wpforms-lite' ) );
$output .= '<div class="wpforms-provider-groups-list">';
foreach ( $groupsets as $groupset ) {
$output .= sprintf( '<p>%s</p>', esc_html( $groupset['name'] ) );
foreach ( $groupset['groups'] as $group ) {
$selected = ! empty( $connection['groups'] ) && ! empty( $connection['groups'][ $groupset['id'] ] ) ? in_array( $group['name'], $connection['groups'][ $groupset['id'] ], true ) : false;
'<span><input id="group_%s" type="checkbox" value="%s" name="providers[%s][%s][groups][%s][%s]" %s><label for="group_%s">%s</label></span>',
esc_attr( $group['id'] ),
esc_attr( $group['name'] ),
checked( $selected, true, false ),
esc_attr( $group['id'] ),
esc_attr( $group['name'] )
* Provider account list fields HTML.
* @param string $connection_id
* @param array $connection
* @return WP_Error|string
public function output_fields( $connection_id = '', $connection = [], $form = '' ) {
if ( empty( $connection_id ) || empty( $connection['account_id'] ) || empty( $connection['list_id'] ) || empty( $form ) ) {
$provider_fields = $this->api_fields( $connection_id, $connection['account_id'], $connection['list_id'] );
$form_fields = $this->get_form_fields( $form );
if ( is_wp_error( $provider_fields ) ) {
$output = '<div class="wpforms-provider-fields wpforms-connection-block">';
$output .= sprintf( '<h4>%s</h4>', esc_html__( 'List Fields', 'wpforms-lite' ) );
// Table with all the fields.
$output .= sprintf( '<thead><tr><th>%s</th><th>%s</th></thead>', esc_html__( 'List Fields', 'wpforms-lite' ), esc_html__( 'Available Form Fields', 'wpforms-lite' ) );
foreach ( $provider_fields as $provider_field ) :
$output .= esc_html( $provider_field['name'] );
! empty( $provider_field['req'] ) &&
(int) $provider_field['req'] === 1
$output .= '<span class="required">*</span>';
$output .= sprintf( '<select name="providers[%s][%s][fields][%s]">', $this->slug, $connection_id, esc_attr( $provider_field['tag'] ) );
$output .= '<option value=""></option>';
$options = $this->get_form_field_select( $form_fields, $provider_field['field_type'] );
foreach ( $options as $option ) {
$value = sprintf( '%d.%s.%s', $option['id'], $option['key'], $option['provider_type'] );
$selected = ! empty( $connection['fields'][ $provider_field['tag'] ] ) ? selected( $connection['fields'][ $provider_field['tag'] ], $value, false ) : '';
$output .= sprintf( '<option value="%s" %s>%s</option>', esc_attr( $value ), $selected, esc_html( $option['label'] ) );
* Provider connection conditional options HTML.
* @param string $connection_id Unique connection ID.
* @param array $connection Configured connection properties.
* @param string|array $form Form properties.
public function output_conditionals( $connection_id = '', $connection = [], $form = '' ) {
if ( empty( $connection['account_id'] ) || ! function_exists( 'wpforms_conditional_logic' ) ) {
return wpforms_conditional_logic()->builder_block(
'form' => $this->form_data,
'subsection' => $connection_id,
'reference' => esc_html__( 'Marketing provider connection', 'wpforms-lite' ),
* Provider account list options HTML.
* @param string $connection_id
* @param array $connection
public function output_options( $connection_id = '', $connection = [] ) {
/********************************************************
* Builder methods - these methods _build_ the Builder. *
********************************************************/
* Fetch and store the current form data when in the builder.
public function builder_form_data() {
// phpcs:disable WordPress.Security.NonceVerification.Recommended