WordPress のショッピングサイト構築プラグイン Welcart で、定期購入プラグイン WCEX Auto Delivery を利用した場合、定期購入商品をカートに入れてお客様情報入力ページに遷移すると、ログインフォームのみが表示されます。そのため、新規の購入者は「新規会員登録はこちら」をクリックして別画面で会員登録をする必要があります。

定期購入は会員登録が必須となっているための仕様と思われますが、通常購入の場合はお客様情報入力ページで購入者情報の入力と同時に任意で会員登録ができるので、これと同じように定期購入の場合でも、お客様情報入力ページでそのまま会員登録ができた方がフローが統一され、分かりやすいのではないかと思います。

そこで検索すると、Welcart のテクニカルノートに「【Auto Delivery】定期購入時のカート遷移中に会員登録フォームの表示カスタマイズ」というドンピシャな記事があったのですが、これは Welcart Basic のテーマを使用した場合のもので、Welcart Basic 独自の関数が使われているため、WCEX Auto Delivery 同梱の wc_customer_page.php を使用したオリジナルテーマには当てはまりません。

また、「次へ」ボタンの非表示だけでなく、パスワード欄の表記なども変更した方がよいので、そのカスタマイズを考えてみました。

まず、購入者情報入力フォームを表示ですが、これは下記のコードによって定期購入の場合に非表示となっていますので、この if 文を削除するかコメントアウトします。

<?php if( ! wcad_have_regular_order() ) : ?> ~ <?php endif; ?>

これだけで購入者情報入力フォームが表示されますが、パスワード欄に必須(*)の表示が無く、「新規会員登録する場合にご記入ください。」という表示がありますので、通常購入の場合はこのままで、定期購入の場合は必須(*)を表示して「新規会員登録〜」は表示しないようにします。

ついでに、テキストフィールドの後にある「新規会員登録〜」を前に移動し、スタイルを当てるために span タグで囲み、定期購入の場合は会員登録が必須であることの文言が表示されるようにしました。

<?php // if( ! wcad_have_regular_order() ) : ?>
  <h2><?php _e('The nonmember please enter at here.','usces'); ?></h2>
  <?php if ( wcad_have_regular_order() ): ?>
  <p>定期購入商品をお申し込みの方は会員登録が必須となります。</p>
  <?php endif; ?>
  <form action="<?php echo USCES_CART_URL; ?>" method="post" name="customer_form" onKeyDown="if (event.keyCode == 13) {return false;}">
    <table border="0" cellpadding="0" cellspacing="0" class="customer_form">
      <tr>
        <th scope="row"><em><?php _e('*', 'usces'); ?></em><?php _e('e-mail adress', 'usces'); ?></th>
        <td colspan="2"><input name="customer[mailaddress1]" id="mailaddress1" type="text" value="<?php echo esc_attr($usces_entries['customer']['mailaddress1']); ?>" /></td>
      </tr>
      <tr>
        <th scope="row"><em><?php _e('*', 'usces'); ?></em><?php _e('e-mail adress', 'usces'); ?>(<?php _e('Re-input', 'usces'); ?>)</th>
        <td colspan="2"><input name="customer[mailaddress2]" id="mailaddress2" type="text" value="<?php echo esc_attr($usces_entries['customer']['mailaddress2']); ?>" /></td>
      </tr>
    <?php if( usces_is_membersystem_state() ) : ?>
      <tr>
        <th scope="row"><?php if( $member_regmode == 'editmemberfromcart' || wcad_have_regular_order() ) : ?><em><?php _e('*', 'usces'); ?></em><?php endif; ?><?php _e('password', 'usces'); ?></th>
        <td colspan="2"><?php if( $member_regmode != 'editmemberfromcart' && ! wcad_have_regular_order() ) : ?><span class="comment"><?php _e('When you enroll newly, please fill it out.', 'usces'); ?></span><?php endif; ?><input name="customer[password1]" id="password1" type="password" value="<?php echo esc_attr($usces_entries['customer']['password1']); ?>" /></td>
      </tr>
      <tr>
        <th scope="row"><?php if( $member_regmode == 'editmemberfromcart' || wcad_have_regular_order() ) : ?><em><?php _e('*', 'usces'); ?></em><?php endif; ?><?php _e('Password (confirm)', 'usces'); ?></th>
        <td colspan="2"><?php if( $member_regmode != 'editmemberfromcart' && ! wcad_have_regular_order() ) : ?><span class="comment"><?php _e('When you enroll newly, please fill it out.', 'usces'); ?></span><?php endif; ?><input name="customer[password2]" id="password2" type="password" value="<?php echo esc_attr($usces_entries['customer']['password2']); ?>" /></td>
      </tr>
    <?php endif; ?>

    <?php uesces_addressform( 'customer', $usces_entries, 'echo' ); ?>
    </table>
    <input name="member_regmode" type="hidden" value="<?php echo $member_regmode; ?>" />
    <input name="member_id" type="hidden" value="<?php echo usces_memberinfo('ID'); ?>" />
    <div class="send">
    <?php usces_get_customer_button(); ?>
    </div>
    <?php do_action('usces_action_customer_page_inform'); ?>
  </form>
<?php // endif; ?>

最後に、定期購入の場合は「次へ」ボタンを非表示にします。これもテクニカルノートの通りとは行きませんので、他の記事を参考にして以下のように functions.php に追加しました。

add_filter( 'usces_filter_get_customer_button', 'my_usces_filter_get_customer_button', 10, 3 );
function my_usces_filter_get_customer_button( $res ) {
  if( wcad_have_regular_order() ){
    return preg_replace( '|<input name="deliveryinfo"(.*?)>|', '', $res);
  } else {
    return $res;
  }
}

これで、通常購入も定期購入も同じ画面遷移とすることができます。