oont-contents/plugins/jetpack/3rd-party/class-salesforce-lead-form.php
2025-02-08 15:10:23 +01:00

149 lines
4.5 KiB
PHP

<?php
/**
* Salesforce Lead Form using Jetpack Contact Forms.
*
* @package automattic/jetpack
*/
namespace Automattic\Jetpack;
use WP_Error;
/**
* Class Salesforce_Lead_Form
*
* Hooks on Jetpack's Contact form to send form data to Salesforce.
*/
class Salesforce_Lead_Form {
/**
* Salesforce_Contact_Form constructor.
* Hooks on `grunion_after_feedback_post_inserted` action to send form data to Salesforce.
*/
public static function initialize() {
add_action( 'grunion_after_feedback_post_inserted', array( __CLASS__, 'process_salesforce_form' ), 10, 4 );
}
/**
* Process Salesforce Lead forms
*
* @param int $post_id - the post_id for the CPT that is created.
* @param array $fields - Contact_Form_Field array.
* @param bool $is_spam - marked as spam by Akismet(?).
* @param array $entry_values - extra fields added to from the contact form.
*
* @return null|void
*/
public static function process_salesforce_form( $post_id, $fields, $is_spam, $entry_values ) {
if ( ! is_array( $fields ) ) {
// nothing to do, also prevent hook from processing actions triggered with different args
return;
}
// if spam (hinted by akismet?), don't process
if ( $is_spam ) {
return;
}
$blocks = parse_blocks( get_the_content() );
$filtered_blocks = self::get_salesforce_contact_form_blocks( $blocks );
// no contact-form blocks with salesforceData and organizationId, move on
if ( empty( $filtered_blocks ) ) {
return;
}
// more than one form on post, skipping process
if ( count( $filtered_blocks ) > 1 ) {
return;
}
$attrs = $filtered_blocks[0]['attrs']['salesforceData'];
$organization_id = $attrs['organizationId'];
// Double sanity check: no organization ID? Abort.
if ( empty( $organization_id ) ) {
return;
}
$keyed_fields = array_map(
function ( $field ) {
return $field->value;
},
$fields
);
// this is yet TBD, campaign IDs are hard to get from SF app/UI, but if
// the user filled it, then send as API field Campaign_ID
if ( ! empty( $attrs['campaignId'] ) ) {
$keyed_fields['Campaign_ID'] = $attrs['campaignId'];
}
// add post/page URL as lead_source
$keyed_fields['lead_source'] = $entry_values['entry_permalink'];
$keyed_fields['oid'] = $organization_id;
// we got this far, try and send it. Need to check for errors on submit
try {
self::send_to_salesforce( $keyed_fields );
} catch ( \Exception $e ) {
// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error
trigger_error( sprintf( 'Jetpack Form: Sending lead to Salesforce failed: %s', esc_html( $e->getMessage() ) ) );
}
}
/**
* POST to Salesforce WebToLead servlet
*
* @param array $data The data key/value pairs to send in POST.
* @param array $options Options for POST.
*
* @return array|WP_Error The result value from wp_remote_post
*/
public static function send_to_salesforce( $data, $options = array() ) {
global $wp_version;
$user_agent = "WordPress/{$wp_version} | Jetpack/" . constant( 'JETPACK__VERSION' ) . '; ' . get_bloginfo( 'url' );
$url = 'https://webto.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8';
$args = array(
'body' => $data,
'headers' => array(
'Content-Type' => 'application/x-www-form-urlencoded',
'user-agent' => $user_agent,
),
'sslverify' => empty( $options['sslverify'] ) ? false : $options['sslverify'],
);
$args = apply_filters( 'jetpack_contactform_salesforce_request_args', $args );
return wp_remote_post( $url, $args );
}
/**
* Extracts any jetpack/contact-form found on post.
*
* @param array $block_array - Array of blocks.
*
* @return array Array of jetpack/contact-form blocks found.
*/
public static function get_salesforce_contact_form_blocks( $block_array ) {
$jetpack_form_blocks = array();
foreach ( $block_array as $block ) {
if (
$block['blockName'] === 'jetpack/contact-form' &&
isset( $block['attrs']['salesforceData'] ) &&
$block['attrs']['salesforceData'] &&
isset( $block['attrs']['salesforceData']['sendToSalesforce'] ) &&
$block['attrs']['salesforceData']['sendToSalesforce'] &&
isset( $block['attrs']['salesforceData']['organizationId'] ) &&
$block['attrs']['salesforceData']['organizationId']
) {
$jetpack_form_blocks[] = $block;
} elseif ( isset( $block['innerBlocks'] ) ) {
$jetpack_form_blocks = array_merge( $jetpack_form_blocks, self::get_salesforce_contact_form_blocks( $block['innerBlocks'] ) );
}
}
return $jetpack_form_blocks;
}
}
Salesforce_Lead_Form::initialize();