WordPress で Stripe 決済を活用してみたので、報告です。

やりたいこと

ウェブメディアブックレコメンド の、各記事の最後に、Stripe決済するフォームを載せたい。どのページから決済されたかを記録したい。
→決済されたページを、ピックアップ記事として表示する(要は、ページを目立たせる広告を購入できるようにする)

もちろん、ページ毎に Stripe 決済フォームを作成すれば実現できますが、ページの数だけ Stripe 決済フォームを作成するのは冗長なので、フォームのページIDを取得して処理するようにしています。

ベースにしたプラグイン

WPPayForm

書いたコード

// フックを活用して、ページ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);
}

完成したコードは、

  1. Stripe決済時に発火するフックで、record_payment関数を呼び出す
  2. record_payment関数は、フックからデータ(ページID、購入数量)を受取り、update_ad_interval関数を呼び出す
  3. update_ad_interval関数は、購入数量に応じて日数を加算し、そのページのカスタムフィールドに保存する

という処理を行っています。