WordPress で Stripe 決済を活用する事例:どのページから決済されたかを記録する
WordPress で Stripe 決済を活用してみたので、報告です。
やりたいこと
ウェブメディアブックレコメンド の、各記事の最後に、Stripe決済するフォームを載せたい。どのページから決済されたかを記録したい。
→決済されたページを、ピックアップ記事として表示する(要は、ページを目立たせる広告を購入できるようにする)
もちろん、ページ毎に Stripe 決済フォームを作成すれば実現できますが、ページの数だけ Stripe 決済フォームを作成するのは冗長なので、フォームのページIDを取得して処理するようにしています。
ベースにしたプラグイン
書いたコード
// フックを活用して、ページIDと、購入数量を取得する
function record_payment( $submission, $form_data ) {
$pid = intval($form_data['__wpf_current_page_id']); // ページID
$day = intval($form_data['item_quantity']); // 購入数量
// 購入数に応じて日数を加算する関数。定義は下部に
update_ad_interval($pid, $day);
}
add_action('wppayform/wpf_before_submission_data_insert', 'record_payment', 10, 2);
// 購入数に応じて日数を加算する。
// DateTimeで計算する。計算結果はカスタムフィールドに保存する。
function update_ad_interval($pid, $day) {
if(!$pid) {
return;
}
if(!$day) {
return;
}
// 広告の基準時刻=現在
$ad_time = new DateTime('now', new DateTimeZone(get_option('timezone_string')));
// 有効期限が残っている場合は、そちらの時刻を採用する
$ad_end_raw = get_post_meta($pid, 'ad_end', true);
if ($ad_end_raw) {
$ad_end = new DateTime($ad_end_raw, new DateTimeZone(get_option('timezone_string')));
$ad_time = max($ad_time, $ad_end);
}
// 日数を追加する
$day_format = 'P'. intval($day) .'D';
$ad_days = new DateInterval( $day_format);
$ad_time->add($ad_days);
// カスタムフィールドに保存する
$ad_end_time = $ad_time->format('Y-m-d H:i:s');
update_post_meta($pid, 'ad_end', $ad_end_time);
}
完成したコードは、
- Stripe決済時に発火するフックで、record_payment関数を呼び出す
- record_payment関数は、フックからデータ(ページID、購入数量)を受取り、update_ad_interval関数を呼び出す
- update_ad_interval関数は、購入数量に応じて日数を加算し、そのページのカスタムフィールドに保存する
という処理を行っています。