Simple membershipプラグインでStripe決済を利用しているサイトがありました。
おそらくテーマのバージョンアップが原因だと思いますが、以前まで普通に動いていたStripe決済ボタンが動かなくなりました。
原因と対策がわかるまで結構時間がかかったのでメモしておきたいと思います。
よくある原因
Stripe決済が一度も動かない場合のよくある原因は、次のものです。
- サイトがSSL化されていない
- Stripe API IDがProduct IDになっている
今回はStripe決済は動いていましたのでこれらの問題は特にありませんでした。
現象
- テーマはSnow monkeyを使用
- Simple membershipのStripe決済用のボタンをショートコードで設置
- Stripe pamentのボタンを押すと以下のエラーが出てStripe決済画面に進まない。
- Fatal error! Payment with ref_id swpm_xxxx|1859 can’t be found
- テーマバージョンアップするまでは、正常に動作していた。
原因
- 直接の原因は使用しているテーマとプラグインの相性の問題
- ボタンのjsでStripeのjsが見つからないというエラーになっている。
- ショートコードが最初に読み込まれたときに、Stripe.jsの読み込みのコードが出力される仕様になっているが、出力されていない。
- Snowmonkeyでは1つのショートコードが2回展開(前処理と本番)されて、2回目のみ出力されるような動きになっていて1回目は無視される。
- ページ表示前に、一度すべてのショートコードが展開される動きが入り、その時点でStripe.jsを追加するコードが用意されるが、出力されないまま無視される。その後、本当にショートコードを展開する時には、Stripe.jsを出力したことになっているので、Stripe.jsを読み込むための記述が出てこなくなる。
対策
①Stripe.jsを自前で読み込む
もともと、ショートコードの展開に合わせて出力されるべきコードをheadタグ内に自前で追加してしまえば問題は起きません。
ショートコードを追加したページにのみ追加したい場合は、page idを限定して読み込めばいいと思います。
<?php
add_action('wp_head',function(){
if(is_page('membership-join')){
?>
<script src="https://js.stripe.com/v3/"></script>
<link rel='stylesheet' href='https://checkout.stripe.com/v3/checkout/button.css' type='text/css' media='all' />
<?php
}
}) ;
②公式テーマのような素性のしっかりしたテーマを使う
Snow monkeyは公式テーマではありません。かなり特殊な構造のテーマゆえにショートコードが2回展開され、発生した問題です。
なぜショートコードが2回展開されて1回目が捨てられる動きになっているのかわからないのでプラグインが正常に動くように対策することも現状難しいです。
別のテーマが使えるなら、別のテーマを使う方が良いかもしれませんが、サイトが完成した後の場合は選択肢にならないと思います。
まとめ
Snow monkeyを使っている人が増えてきていますので、Simple membershipのショートコードとの相性問題で突然動かなくなって焦っている人は結構多いかもしれないので、今回の記事を参考にしてみてください。
Snow monkeyはWordpressのバージョン縛りがあったり、テーマをバージョンダウンすることも難しく、不具合が起きると致命傷になることが多いテーマですので、バージョンアップ前にバックアップを取ることをお勧めします。