welcart:非公開のテスト用商品を作りカートに入れて購入まで行えるようにする
Tag: Welcart
welcartで運用中のサイトで商品の登録テストを行う場合、多分非公開で登録すると思います。
商品詳細ページの見た目とか一覧の表示とかを確認するだけならいいのですが、非公開で登録するとカートに入れるまでしか行えず購入テストができません。
カートから次に進もうとするとこんな感じで売り切れ表示になります。
なので、商品購入までテストできるようにカスタマイズしたいと思います。
テストの商品を作る
まず普通にテスト商品を登録します。
特に決め事は無いですが、「非公開」とか付けておくとわかりやすいかと思います。
まずはwordrepssの仕様に沿って「下書き」もしくは「非公開」で登録し、記事IDを確定させておきます。
functions
functions.phpで上記で登録した商品を表示させないようにカスマイズします。
まずはテスト用商品の記事IDをグルーバル変数に入れておきます。
テスト商品の数に上限はありません。
global $private_items; $private_items = array(100); //複数対応 $private_items = array(100,200,300); //動作させない $private_items = false;
一覧に出さない
wordrepssにログインしていない場合、テスト商品を商品一覧に表示させないようにします。
function delete_private_item_list( $query ) {
//管理画面
if ( is_admin() ) return;
//ログイン済み
if( is_user_logged_in() ) return;
//テストアイテムは削除
global $private_items;
if( !empty( $private_items ) && $query->is_category ) {
$query->set( 'post__not_in', $private_items );
}
}
add_action( 'pre_get_posts', 'delete_private_item_list' );
まず管理画面およびログイン済みの場合は何もしません。
次にテスト商品がセットされているかつカテゴリーのリストの場合にリストから設定された商品IDを省きます。
関数「pre_get_posts」を調べると「$query->is_main_query()」を書いてる場合が多いですがここでは省略しています。
なぜならこれを書くと「get_posts」で取得している部分には効かないんですよね。
逆にすでにpre_get_postsを使っていてどうにもならない場合は、get_postsを使っている箇所それぞれに上記の処理を足してください。
商品詳細ページを404に
wordrepssにログインしていない場合、商品詳細ページは404を返すようにします。
function not_view_private_item() {
//single
if( !is_single() ) return;
//ログイン済み
if( is_user_logged_in() ) return;
//テストアイテムがない
global $private_items;
if( empty( $private_items ) ) return;
//テストアイテムは404
global $wp_query,$post;
if( in_array( $post->ID, $private_items, true ) ) {
$wp_query->set_404();
status_header( 404 );
nocache_headers();
get_template_part( '404' );
exit;
}
}
add_action( 'template_redirect', 'not_view_private_item' );
singleページじゃないおよびログイン済みの場合は何もしません。
次にテスト商品の変数が空の場合も何もしません。
条件に当てはまれば404を返し、テンプレートも404.phpを読み込みます。
カートから削除する
新しく商品を登録する場合は商品詳細ページが見えないので大丈夫なのですが、登録済みの商品を非公開にしてテストしたい場合、タイミングによってはユーザーがカートに入れてる場合があります。
なのでwordrepssにログインしていない場合はカートからテスト商品を削除してやります。
function delete_private_item_cart( $row, $cart, $materials ) {
//ログイン済み
if( is_user_logged_in() ) return $row;
//テストアイテムは削除・出力させない
global $private_items;
$post_id = $materials['post_id'];
if( !empty( $private_items ) && in_array( $post_id, $private_items, true ) ) {
$serial = $materials['cart_row']['serial'];
unset( $_SESSION['usces_cart'][$serial] );
} else {
return $row;
}
}
add_filter( 'usces_filter_cart_row', 'delete_private_item_cart', 10, 3 );
フィルター「usces_filter_cart_row」はカートのテーブルを出力する際に1行ごと処理を通すことが可能です。
ログイン済みの場合はカートのHTMLソースをそのまま返します。
次にテスト商品がセットされているかつ現在の行の記事IDがテスト商品の変数に含まれる場合、カートのHTMLソースを削除・カートデータから削除します。
条件に当てはまらない場合はHTMLソースをそのまま返します。
カートデータは「$_SESSION[‘usces_cart’]」にあり、ここから削除しないと消えません。
テスト商品を公開
ここまでできたらテスト商品を「公開」状態にします。
これでwordrepss公式ではありませんが非公開で商品登録し購入までできるようになりました。
導入の際は十分に気をつけてください。
ブラウザを複数用意し、ログイン済み・未ログインで都度確認しながら行ってください。

