先日メインサイトもVPSに移そうと思ったものの、サーバー移管に伴ってACメーラーが使い難くなりなりそうで一時断念しました。
たま~にしかメルマガは送っていませんが、無くては困る機能の一つの為、急遽全てWordpress内で動作させる事を考えてメルマガプラグインとの連動をローカル上で構築してみました。
そのメモ。
目次
メルマガプラグイン『MailPoet』
以前からwordpress上で使えるメールマガジンシステムは検討していたので、チョロチョロとは知っていますが今回真剣に検討してみたトコロ『MailPoet』が良いかな?と。
『MailChimp(メールチンプ)』も考えましたが、企業が行っている配信サービス故にプラン等に大幅な変更があった時にまた悩むのが面倒だな…と思い、プラグインのように最悪自分でどうにか出来るモノにしておこうと『MailPoet』をひとまず選択してみました。
マルチパート形式のメール配信がGOOD!!
『MailPoet』を触ってみて良かったのはマルチパート形式でメール配信が出来る事。
マルチパートってのはHTML形式とテキスト形式を同時に配信出来て、勝手にメールソフトに合ってくれます。
だから作るメールは1つで良い。
上のメールのように2つで1つ、1つで2つです。
HTML形式が受け取れればそれで表示しますし、メールソフトがテキスト形式なら自動でそうなるワケですな。
これは大変便利です。
ちなみに『MailChimp(メールチンプ)』もマルチパートだって書いてあった気がするようなしないような…。
微妙過ぎる記憶でスイマセン。
Welcartとの連動
はい これが最大のテーマです。
普通に配信するだけなら、正直何でも良いのですよ。
問題は連動させられるか させられないかです。
複雑にこねくり回せば、なんだって連動させられるんでしょうが、僕はそこまでプログラマーじゃ無いから出来るだけイージーに行きたいのです。
『MailPoet』自体はメジャーなプラグインですし、WooCommerceとの連動はあるようなのでWelcartでもやってる人がいて、情報は転がってるだろー とか思ったら…無いし(汗)
本業の方はご自身の飯のタネかも知れませんからナカナカ書かないのかも知れません。
残念で仕方ありません。
なので自分で全て書きましたよ。
マジで面倒でした。
買い物完了後の連動
さっさとメモります。
まずはお買い物時にメルマガ申し込みがあった際の連動。
まずはwc_completion_page.phpを作って、完了画面を自分のテーマに入れる。
そして、カートページ設定→カスタム、カスタマーフィールドでメールマガジンのフィールドを作る。
僕はチェックボックスで作っています。
そしてwc_completion_page.phpに連動のコードを書く。
global $usces; $entry = $usces->cart->get_entry(); if($entry['custom_customer']['mailmagazinecf']['受け取る'] == true){ global $wpdb; $table_name = $wpdb->prefix . 'wysija_user'; $wysij_sql="SELECT email FROM ".$wpdb->prefix . "wysija_user"; $wysij_sql_result = $wpdb->get_results($wysij_sql,OBJECT); $wysijobj = ''; $entmailad = $entry['customer']['mailaddress1']; foreach($wysij_sql_result as $key=>$val){ $wysijobj[] = $val->email; } if( !in_array($entmailad, $wysijobj) ){ $timestp = time() ; $wpdb->insert( $table_name, array('email'=>$entmailad,'status' => '1','created_at' => $timestp) ); } };
フィールドキーやセレクト値が同じじゃないと当然上のコードが動かないんで、そこんとこ宜しくです。
あと、何となく別のヤツで書いてたモノをコピーして書き換えたので、MailPoetの独自テーブルからemailを全て拾って、配列にしてからphpで調べて、無い場合は登録。
なんて感じにしてしまいましたが、必要なアドレスが取得出来るか出来無いかで分岐させれば良かった…
とはいえ僕のお店で抱えてるリスト位なら別に良いやと思ってそのままです。
お客様の数が多い場合はSELECT文を書き直したほうが良いのかも知れないです。
ただ、SQLを探すのとPHPで一致を調べるのって動作としてはドッチが早いんだろー?って疑問に思いました。
ついでに、お買い物完了ページでどんなデータが取得出来るのか調べるのがとても面倒でした。
入会時の連動
はい 次は会員入会時の連動です。
これはwc_member_completion_page.phpでやりますので、これをテーマに設置します。
そしてコード。
if(isset($_POST['custom_member']['mailmagazinem'])){ check_admin_referer( 'post_member', 'wc_nonce'); global $wpdb; $table_name = $wpdb->prefix . 'wysija_user'; $wysij_sql="SELECT email FROM ".$wpdb->prefix . "wysija_user"; $wysij_sql_result = $wpdb->get_results($wysij_sql,OBJECT); $wysijobj = ''; foreach($wysij_sql_result as $key=>$val){ $wysijobj[] = $val->email; } if( !in_array($_POST['member']['mailaddress1'], $wysijobj) ){ $timestp = time() ; $wpdb->insert( $table_name, array('email'=>$_POST['member']['mailaddress1'],'status' => '1','created_at' => $timestp) ); } };
これも当然フィールドキーはご自身のサイトに合わせるか、上に合わせる。
この場合はPOST送信がセットされてるかだけを条件にしてます。
一応nonceも使っておいた。
あと、今気が付いたんですが、最初の頃に書いたので動作の挙動の検証が甘いかも知れない…。
まぁ 多分大体は大丈夫だと思うけど…。
会員様のアドレス変更時
これは面倒だった。
編集箇所はwc_member_page.php。
テーマに無い場合は他の同様設置する。
そしてコード。
まずはhtmlで最初に登録されているアドレスを確保する。
<input id="fastmailid" name="fastmailad" type="hidden" value="" /> <script> var fastmad = document.getElementById( 'mailaddress1' ) ; document.getElementById('fastmailid').value = fastmad.value; </script>
hiddenのinputタグにjavascriptで追加。
if( isset($_POST['editmember'])){ if(isset($_POST['custom_member']['mailmagazinem']) && ( $_POST['editmember'] == '更新する')){ check_admin_referer( 'post_member', 'wc_nonce'); $fastmail = isset($_POST['fastmailad']) ? $_POST['fastmailad'] : null; $setmail = isset($_POST['member']['mailaddress1']) ? $_POST['member']['mailaddress1'] : null; global $wpdb; $table_name = $wpdb->prefix . 'wysija_user'; $wysij_sql="SELECT email FROM ".$wpdb->prefix . "wysija_user"; $wysij_sql_result = $wpdb->get_results($wysij_sql,OBJECT); $wysijobj = ''; foreach($wysij_sql_result as $key=>$val){ $wysijobj[] = $val->email; } if( $fastmail != $setmail){// アドレス変更時 if( $setmail != null && !in_array($setmail, $wysijobj) ){// new登録 $timestp = time() ; $wpdb->insert( $table_name, array('email'=>$setmail,'status' => '1','created_at' => $timestp) ); } if( $fastmail != null && in_array($_POST['fastmailad'], $wysijobj) ){// old削除 $delad_sql="DELETE FROM ".$table_name." where email = '".$_POST['fastmailad']."'"; $wpdb->query($delad_sql); } }else{ if( $setmail != null && !in_array($setmail, $wysijobj) ){// new登録 $timestp = time() ; $wpdb->insert( $table_name, array('email'=>$setmail,'status' => '1','created_at' => $timestp) ); } } } elseif(!isset($_POST['custom_member']['mailmagazinem']) && ( $_POST['editmember'] == '更新する')){// メルマガ無し $fastmail = isset($_POST['fastmailad']) ? $_POST['fastmailad'] : null; check_admin_referer( 'post_member', 'wc_nonce'); global $wpdb; $table_name = $wpdb->prefix . 'wysija_user'; $wysij_sql="SELECT email FROM ".$wpdb->prefix . "wysija_user"; $wysij_sql_result = $wpdb->get_results($wysij_sql,OBJECT); $wysijobj = ''; foreach($wysij_sql_result as $key=>$val){ $wysijobj[] = $val->email; } if( $fastmail != $_POST['member']['mailaddress1']){ if( $fastmail != null && in_array($_POST['fastmailad'], $wysijobj) ){// 削除 $delad_sql="DELETE FROM ".$table_name." where email = '".$_POST['fastmailad']."'"; $wpdb->query($delad_sql); } if( in_array($_POST['member']['mailaddress1'], $wysijobj) ){// 削除 $delad_sql="DELETE FROM ".$table_name." where email = '".$_POST['member']['mailaddress1']."'"; $wpdb->query($delad_sql); } }else{ if( in_array($_POST['member']['mailaddress1'], $wysijobj) ){// 削除 $delad_sql="DELETE FROM ".$table_name." where email = '".$_POST['member']['mailaddress1']."'"; $wpdb->query($delad_sql); } } } };
今考えればPOST送信の値でやったから面倒だったんだと思う。
別のデータも拾える可能性が大だな と後で思いました。
他の部分にも似た感じで連動可
メールアドレスを入力する必要のある部分は大凡似た感じで連動されられます。
データを取りやすいのはPOST送信のデータでしょう。
postされたデータを見るのに便利なのが
foreach($_POST as $idx => $val){echo "$idx = $val<br>";}
この1行。
何がPOSTされてるか見られます。
僕はお問合せページや、入荷連絡フォームも連動させるように書きました。
そして最後に気が付いてしまいましたが…
会員削除時の動作を忘れていましたね・・・。
これは後で書きます。
何せまだローカル上での動作で、運営中のサイトにはやってませんのでスイマセン。
まとめ
とはいえ、今回の件で随分動きが分かったので、もしも『MailChimp(メールチンプ)』と連動させる事になったとしても割とすんなり行きそう。
というかACメーラーの時も、もっと良い書き方があったな…と痛感しました。
かなりテキトーにザーッと書きましたが、メモなんでスイマセン。
ではでは
本番環境で動かしてみたトコロ、連動させるSQLがもう一つ必要です。
リストのデータが入ってるテーブルの値も一緒に消さないと、無駄にデータベースが肥大します。
面倒なのでその一文は書きませんので、ご自身で調べて加える必要ありです。