はじめに
「SalesforceとWebサイトの連携方法も学んでおこう」
ということで、今回はWordPressで作成したフォームから、Salesforceのレコードを作成する処理を実装しました。
実装したい内容を網羅することはできませんでしたが、学習記録として投稿します。
今回はWordPressをLocalというツールで立ち上げ、プラグインのContactForm7でフォームの作成、Salesforce(DeveloperEdition)と接続して、リードレコードの作成を試みました。
記事を読んでアドバイス等ありましたら、ぜひお願いします!
実装したいこと
- Webページの既存フォームから送信された情報をメール送信
- Salesforceのリードに新規レコードとして登録する
- リードから取引開始をした時に、取引先責任者ではなく、取引先に値を入れる
できなかったこと
- リードレコードの新規作成時にレコードタイプを指定する
実装した機能の完成形
WordPressをLocalで立ち上げる
今回は学習用なので、Localというツールを使いました。
Localの導入の仕方については、省略します。
WordPressを立ち上げたら、プラグインをインストールします。
今回はContactForm7とWP ContactFormSalesforceを使用します。
WordPressでフォームを作成する
フォームの編集画面で項目を作成します。
inputhidenフィールドでリードのレコードタイプのIDを渡しています。
WordPressとSalesforceのアカウントを連携する
WP ContactFormSalesforceの無料版では、標準項目のみ対応しています。
WP ContactFormSalesforceを有効化していると、WordPressの管理画面のサイドバーに[Salesforce]という項目があるので、選択します。
[Salesforce Accounts]タブから[Add New Account]を選択します。
下記の情報を入力します。
- Account Name:任意
- Environment:Production
- Integration Method:Web-to-Lead or Web-to-Case
- Salesforce Org.ID:接続する組織のID
Salesforce Org.IDは、Salesforceの[設定]から[組織情報]を選択すると確認できます。
[Salesforce Feeds]の[Add New]を選択します。
下記の情報を入力します。
- Feed Name:任意
- Salesforce Account:接続したアカウントを選択
- Contact Form Form:作成したフォームを選択
- Saleforce Object:レコードを登録したいオブジェクトを選択
- Field Mapping:フォームの値をどの項目にマッピングしたいかを選択
今回は既存のフォームとSalesforceを連携するために、この方法を試みました。
しかし、WP ContactFormSalesforceの無料版では、標準項目にしか値を送信できません。
(有料版を使うとカスタム項目にも値を送信することができます)
また、レコードタイプの指定もうまくできませんでした。
(リードのレコードタイプがA,Bの二種類あるとき、BのレコードタイプIDを送信しても、Aで作成される)
WP ContactFormSalesforceを使わずに再チャレンジ
次は、WP ContactFormSalesforceを使わずに、カスタム項目への値の送信とレコードタイプの指定ができるか試してみます。
Salesforceの[設定]で[Web-to-リード]を選択します。
reCAPTCHAを設定することもできますが、今回はチェックを外します。
サンプルコードを元にWordPressでフォームを作成します。
function.phpにコードを追加します。(下記の記事を参考にさせていただきました)
function sf_web_to_lead($cf7)
{
// 送信されるデータを取得します。
$submission = WPCF7_Submission::get_instance();
$posted_data = $submission->get_posted_data();
// POSTするクエリを用意します。
$query_data = array();
foreach ($posted_data as $name => $value) {
// Contact form 7用のパラメータはスキップします。
if (0 === strpos($name, '_wpcf7')) {
continue;
}
// 複数選択可能なフィールド(select[multiple]やcheckboxなど)の場合は、
// hoge=value1&hoge=value2のように送信します。(Salesforceの仕様)
if (is_array($value)) {
foreach ($value as $option_value) {
$query_data[] = sprintf('%s=%s', $name, $option_value);
}
} else {
$query_data[] = sprintf('%s=%s', $name, $value);
}
}
$query = implode('&', $query_data);
// Init cURL session
$ch = curl_init();
$sf_url = 'https://webto.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8';
curl_setopt($ch, CURLOPT_URL, $sf_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
$response = curl_exec($ch);
if (curl_errno($ch)) {
error_log('cURL error: ' . curl_error($ch));
}
curl_close($ch);
return $cf7;
}
add_action('wpcf7_before_send_mail', 'sf_web_to_lead');
Web-to-リードからレコードタイプを渡すには、フォームに下記のコードを追加します。
<input type=hidden name="recordType" id="recordType" value="XXXXXXXXXXXXXXX">
しかし、 ContactForm7を介してフォームを作成するとうまくいきませんでした。
リードのデータをコピーするフローの作成
Salesforceのフローで、以下の機能を実装します。
- リードが取引開始になった時、取引先責任者の情報を取引先にコピーする
- 取引先責任者を削除する
取引先オブジェクトには[氏名]という項目のみなので、
取引先責任者オブジェクトに[姓]と[名]を結合させた形で表示する新規項目を作成します。
(元々あるName項目は、取引先のName項目と紐付けができませんでした。敬称が含まれているからかもしれません)
[設定]から[フロー]、[新規フロー]を選択します。
[最初から作成]で[自動起動フロー]を選択します。
オブジェクトは[取引先責任者]、トリガーを[レコードが作成された]に設定します。
[要素を追加]で、[関連レコードを更新]を選択します。
関連するレコードに[取引先ID]を設定します。
取引先の項目値に、取引先責任者の値を設定します。
Nameには、上記で作成した新規項目の値を紐づけます。
取引先責任者の作成時に、取引先にデータをコピーして、取引先責任者レコードを削除するフローが完成しました。
フォームからカスタム項目に値を送信する
リードオブジェクトに新規カスタム項目を作成します。
(API参照名:Web_to_lead_test__c)
フォームに下記コードを追加して、カスタム項目にも値が送信されるか試します。
<label for="Web_to_lead_test__c">カスタム項目テスト</label>
<input id="Web_to_lead_test__c" maxlength="40" name="Web_to_lead_test__c" size="20" type="text" /></br>
まとめ
今回は、WordPressのContactForm7とSalesforceのWeb-to-リードでレコードを作成する機能を実装しました。
[WordPressのプラグイン]や[Salesforceのカスタム項目]など、様々な要素が関わると、想定通りの挙動を実装することが難しいですね。
Salesforceにおいて、できるだけ標準機能での実装を意識することが、保守性を高める上で大切だと感じました。