Send contact form submissions from other plugins to multiple external services e.g. CRM. Configurable, custom field mapping, pre/post processing.
Send Contact Form 7, Gravity Forms, or Ninja Forms Submissions to a 3rd-party Service, like a CRM. Multiple configurable services, custom field mapping. Provides hooks and filters for pre/post processing of results. Allows you to send separate emails, or attach additional results to existing emails. Comes with a couple examples of hooks for common CRMs (listrak, mailchimp, salesforce). Check out the FAQ section for add-on plugins that extend this functionality, like sending XML/SOAP posts, setting headers, and dynamic fields.
The plugin essentially makes a remote request (POST) to a service URL, passing along remapped form submission values.
Based on idea by Alex Hager “How to Integrate Salesforce in Contact Form 7“.
Original plugin, Contact Form 7: 3rdparty Integration developed with the assistance of AtlanticBT. Current plugin sponsored by Stephen P. Kane Consulting. Please submit bugs / support requests to GitHub issue tracker in addition to the WordPress Support Forums because the Forums do not send emails.
Please note that this documentation is in flux, and may not be accurate for latest rewrite 1.4.0
add_action('Forms3rdPartyIntegration_service_a#', $response, $param_ref);
#
– this is given in the ‘Hooks’ section of each service$response, &$results
as argumentsarray('success'=>false, 'errors'=>false, 'attach'=>'', 'message' => '');
true
or false
– change whether the service request is treated as “correct” or notadd_action('Forms3rdPartyIntegration_service', $response, $param_ref, $sid);
add_filter('Forms3rdPartyIntegration_service_filter_post_#, ...
#
– this is given in the ‘Hooks’ section of each service$post
arrayadd_filter('Forms3rdPartyIntegration_service_filter_post', 'YOUR_HOOK', 10, 4);
_a#
; accepts params $post
, $service
, $form
, $sid
add_filter('Forms3rdPartyIntegration_service_filter_args', 'YOUR_HOOK', 10, 3);
wp_remote_post
response_bypass
, it will skip the normal POST and instead use that value as the 3rdparty response; note that it must match the format of a regular wp_remote_post
response.response_bypass
you should consider including the original arguments in the callback result for debugging purposes.add_action('Forms3rdPartyIntegration_remote_failure', 'mycf7_fail', 10, 5);
hook to modify the Form (CF7 or GF) object if service failure of any kind occurs — use like:
function mycf7_fail(&$cf7, $debug, $service, $post, $response) {
$cf7->skip_mail = true; // stop email from being sent
// hijack message to notify user
///TODO: how to modify the “mail_sent” variable so the message isn’t green? on_sent_ok hack?
$cf7->messages[‘mail_sent_ok’] = ‘Could not complete mail request:** ‘ . $response[‘safe_message’];
}
needs some way to alter the mail_sent
return variable in CF7 to better indicate an error – no way currently to access it directly.
add_action('Forms3rdPartyIntegration_service_settings', 'YOUR_HOOK', 10, 3)
$eid
, $P
, $entity
corresponding to the index of each service entity and this plugin’s namespace, and the $entity
settings array$P[$eid][YOUR_CUSTOM_FIELD]
$rarr; Forms3rdPartyIntegration[0][YOUR_CUSTOM_FIELD]
add_action('Forms3rdPartyIntegration_service_metabox', 'YOUR_HOOK', 10, 2)
$P
, $entity
corresponding to the index of each service entity and this plugin’s namespace, and the $options
settings array (representing the full plugin settings)$P[YOUR_CUSTOM_FIELD]
$rarr; Forms3rdPartyIntegration[YOUR_CUSTOM_FIELD]
add_filter('Forms3rdPartyIntegration_debug_message', 'YOUR_HOOK', 10, 5);
add_filter('Forms3rdPartyIntegration_plugin_hooks', 'YOUR_HOOK', 10, 1);
add_filter('Forms3rdPartyIntegration_service_filter_url', 'YOUR_HOOK', 10, 2);
$service_url, $post_args
and returns the endpoint $url
$post_args
contains the body
and other wp_remote_post
detailsBasic examples provided for service hooks directly on plugin Admin page (collapsed box “Examples of callback hooks”). Code samples for common CRMS included in the /3rd-parties
plugin folder.
From the website and Handpicked Tomatoes:
Transparent and Holistic Approach
Transparency is good. It’s amazing how many web design sites hide who they are. There are lots of reasons, none of which are good for the customer. We don’t do that. I’m Stephen Kane, principal web craftsman at HandpickedTomatoes, and I’m an Orange County based freelancer who occasionally works with other local freelancers and agencies to deliver quality web solutions at very affordable prices.
We work to earn the right to be a trusted partner. One that you can turn to for professional help in strategizing, developing, executing, and maintaining your Internet presence.
We take a holistic view. Even if a project is small, our work should integrate into the big picture. We craft web architecture and designs that become winning websites that are easy to use and to share. We custom build social network footprints on sites like linkedin, facebook, twitter, youtube, flickr, yelp!, and google places and integrate them into your website to leverage social marketing. We help you set up and execute email campaigns, with search engine marketing, with photography, with site copy and content and anything else that you need in order to have a successful Internet presence.
Through this holistic approach, we work with clients to grow their sales, improve their brand recognition, and manage their online reputation.
/wp-content/plugins/
)Turn on ‘debug mode’ from the admin page to send you an email with:
Submit an issue to the [GitHub issue tracker][] in addition to / instead of the WP Support Forums.
See [Screenshots][] for visual examples.
Essentially,
See section Hooks. See plugin folder /3rd-parties
for example code for some common CRMs, which you can either directly include or copy to your code.
&post-values=a,b,c
.[]
as the separator it will instead create multiple keys like &post-values[]=a&post-values[]=b&...
.[#]
to retain the numerical index: &post-values[0]=a&post-values[1]=b&...
[%]
to place the numerical index at desired location; specifically useful with nested fields via Xpost below (and issues #11 and #7).If you instead need to combine/nest fields, check out Forms: 3rdparty Xpost.
Since v1.7.6, it’s an admin setting for GET and POST, but for anything other than those two that you’d write a hook.
from https://wordpress.org/support/topic/method-get?replies=2#post-5996489
See ‘Hooks’ section, #5 of https://wordpress.org/plugins/forms-3rdparty-integration/other_notes/ and the source code.
You’ll need to perform wp_remote_get
inside that filter and set $post_args['response_bypass']
with the response, something like:
function my_3rdparty_get_override($post_args, $service, $form) { $post_args['response_bypass'] = wp_remote_get($service['url'], $post_args); return $post_args; }
Use the hook Forms3rdPartyIntegration_service_filter_url
. (see “Hooks” section)
Using hidden fields can provide an easier way to include arbitrary values on a per-form basis, rather than a single “Is Value?” in the Service mapping, as you can then put your form-specific value in the hidden field, and map the hidden field name generically.
For convenience, you can install the Contact Form 7 Modules: Hidden Fields. This plugin originally included the relevant code, but it was causing issues on install, so is no longer bundled with it.
Use the “Forms 3rdparty Migration” plugin https://wordpress.org/plugins/forms-3rdparty-migrate/, which lets you export and import the raw settings as JSON.
You can also export settings from the original plugin [Contact Form 7: 3rdparty Integration][] and “upgrade” them for this plugin (although > 1.6.1 you will need to reselect forms).
Also at https://github.com/zaus/forms-3rdparty-migrate
Use the “Dynamic Fields” plugin: https://wordpress.org/plugins/forms-3rdparty-dynamic-fields/
Also at https://github.com/zaus/forms-3rdparty-dynamicfields
For simple xml containers try the “Forms 3rdparty Xpost” plugin: https://wordpress.org/plugins/forms-3rd-party-xpost/
Also at https://github.com/zaus/forms-3rdparty-xpost
You can also set headers with “Forms 3rdparty Xpost” plugin: https://wordpress.org/plugins/forms-3rd-party-xpost/
Also at https://github.com/zaus/forms-3rdparty-xpost
The failure message is shown by default if the 3rdparty post did not succeed. You can add custom messaging to the plugin’s (GF, CF7, Ninja) email or success screen response with something like:
class MyPlugin { public function MyPlugin() { add_filter('Forms3rdPartyIntegration_service', array(&$this, 'adjust_response'), 10, 2); } public function adjust_response($body, $refs) { // use 'attach' to inject to regular email // use 'message' to inject to page $refs['attach'] = 'custom message in email'; $refs['message'] = 'custom message on page'; } } new MyPlugin(); // attach hook
Use hook ‘…use_submission’ to check the form submission (pre-mapping), making sure to pick the appropriate scenario, like:
add_filter('Forms3rdPartyIntegration_use_submission', 'f3i_conditional_submit', 10, 3); function f3i_conditional_submit($use_this_form, $submission, $sid) { // if there was a specific value -- skip if(isset($submission['maybe-send']) && 'no' == $submission['maybe-send']) return false; // if there was a specific value -- use if(isset($submission['maybe-send']) && 'yes' == $submission['maybe-send']) return $use_this_form; // or true, i guess // if there was a value for it (e.g. for checkboxes) -- skip if(isset($submission['if-not-send'])) return false; // if there was a value for it (e.g. for checkboxes) -- use if(isset($submission['if-send']) && !empty($submission['if-send'])) return $use_this_form; // or true, i guess return $use_this_form; // or `false`, depending on your desired default }
If you want to check after the fields have been mapped, you can “reuse” the hook ‘…service_filter_args’ and return false
to skip, rather than bypass:
add_filter('Forms3rdPartyIntegration_service_filter_args', 'f3i_conditional_post', 10, 3); function f3i_conditional_post($post_args, $service, $form) { // your skip scenarios, checking `body` subarray instead if(isset($post_args['body']['maybe-send']) && ...) return false; // regular behavior return $post_args; }
Using public instance functions send
and handle_results
:
$f3p = Forms3rdPartyIntegration::$instance; $debug = $f3p->get_settings(); // $sid - maybe get it from the current filter // $form - maybe get it from the current filter // $submission - probably save it somewhere, or rebuilt it from a database entry, etc // $service = $f3p->get_services()[$sid]; $sendResult = $f3p->send($submission, $form, $service, $sid, $debug); if($sendResult === Forms3rdPartyIntegration::RET_SEND_STOP || $sendResult === Forms3rdPartyIntegration::RET_SEND_SKIP) return; $response = $sendResult['response']; $post_args = $sendResult['post_args']; return $f3p->handle_results($submission, $response, $post_args, $form, $service, $sid, $debug);
See “Forms: 3rdparty Post Again”
See “Forms: 3rdparty Inject Results”
However, currently only confirmed working with Gravity Forms.
...debug_truncation
to set field length limits for each section..._service_mappings_headers
and ..._service_mappings_values
to add more columnsbefore_send
to make reposting GF submissions easier$form = apply_filters(Forms3rdPartyIntegration::$instance->N('inject'), $form, $values_to_inject);
_json
mode
array)$service
to hook get_submission
to make extensions easier$submission
in service_filter_post
hook for dynamicfields calcDue to the new common form extension base, the way forms are identified in the settings has been changed.
Deactivating and reactivating the plugin (which happens automatically on upgrade, but not FTP or other direct file changes) should correct your existing settings.
Depending on how many services you have configured, the upgrade path may DESELECT your form selections in each service or otherwise break some configurations.
If you are concerned this may affect you, please export the settings so you can reapply your selections.
Trying to add some clarity to the admin pages
[]
, or [#]
data-icon
; entire metabox title now toggles accordion)...service_filter_args
to allow altering post headers, etcForms3rdPartyIntegration_service_filter_post
in addition to service-specific with suffix _0
; accepts params $post
, $service
, $form
, $sid
Forms3rdPartyIntegration_service_settings
, ..._metabox
init
normally to check CF7moved “external” includes (hidden-field plugin) to later hook to avoid conflicts when plugin already called
changed filter callback to operate on entire post set, changed name
fixed weird looping problem; removed some debugging code; added default service to test file
moved filter to include dynamic and static values; icons
added configuration options, multiple services
base version, just directly submits values