ここではWelcartの商品カテゴリを指定して、商品リストを表示する関数を作成します。
「全商品」、「おすすめ商品」、「新製品」及び「商品カテゴリ」の商品リスト表示が対象です。
尚、このプログラムは下記の設定が完了している事が前提となります。
②Jqueryで制御するスライダープラグイン「slick.js」の導入と使い方
③総ての「Font Awesome」アイコンフォントを利用可能にする
1.カテゴリ商品のリスト関数の開発方針
1.関数名と引数
category_products($slug,$pc_num,$sm_num,$msg)
引数 | デフォルト値 | 備考 |
$slug | なし | 検索するカテゴリのスラッグ名。数値か”で括ったカテゴリ名 |
$pc_num | 5 | PC画面の時、1行に表示する商品数 |
$sm_num | 2 | スマホ画面の時、1行に表示する商品数 |
$msg | なし | リストタイトルの名前 スラッグ名からカテゴリ名を自動抽出しますが、このタイトル気に入らない場合はここで指定します |
上記の$slugの指定方法には下記の物があります。
$slugの値 | 変換されるスラッグ名 | カテゴリ名 |
1 | itemgenre | 商品ジャンル(全商品のこと) |
2 | itemreco | お勧め商品 |
3 | itemnew | 新製品 |
‘カテゴリ名’ | ー | 商品ジャンル(itemgenre)に下に設定した商品カテゴリ |
また上記のスラッグ名からカテゴリ名を取得する関数は下記を利用します。
$cat_info = get_category_by_slug($slug);
$cat_name = $cat_info -> name;
しかし自動抽出したカテゴリ名がリストの表示タイトルとして気に入らない場合は、$msgで直接、指定して下さい。
2.その他の条件
①カテゴリ商品が1行に表示する商品数を超えた場合は「slick.js」でスライドさせる。
よって「slik.js」がインストールされている必要があります。
②1ページにこの関数が「新製品」、「お勧め商品」の様に複数回呼ばれることもあるので、CSSやJqueryのクラスはスラグ名を利用します。
3.この関数を利用する場所
プロントページ、固定ページを原則としますが、個別商品ページやその他のページに配置しても問題ありません。
2.プログラム
1.functions.phpに記述する内容
/* 商品リスト関数の追加 */ get_template_part('func/welcart/item-list/category_products'); /* カテゴリ商品 */
■「welcart」の下に「item-list」フォルダを作成し、その中に「category_products.php」関数を作成します。
2.category_products.phpの中身
<?php /***************************************************************************** カテゴリ商品のリスト出力 引数 $slug :抽出するカテゴリ 引数 $pc_num:1行の表示個数(PC)デフォルトは「5」 引数 $sm_num:1行の表示個数(スマホ)デフォルトは「2」 引数 $msg :タイトル名 *******************************************************************************/ function category_products($slug,$pc_num=5,$sm_num=2,$msg='') { if($slug == 1){$slug='itemgenre';} elseif($slug == 2){$slug='itemreco';} elseif($slug == 3){$slug='itemnew';} if($msg == ''){ $cat_info = get_category_by_slug($slug); $msg = $cat_info -> name; } $msg = '<i class="fas fa-grip-lines-vertical" style="color:blue;"></i> '.$msg; /* ①タイトル */ $args = array( /* ②Wp_Queryパラメータのセット */ 'posts_per_page' =>-1, 'category_name' => $slug, 'meta_key' => 'price', 'orderby' => 'meta_value_num', 'order' => 'asc', ); $products = new WP_Query( $args ); $slug_class = '.'.$slug /* クラス名でスラッグ名を利用します */ ?> <h3><?php echo $msg;?></h3> <div class='<?php echo $slug;?>'> /* ③商品のリスト */ <?php while ($products->have_posts()) : $products->the_post(); ?> <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <div class="itemimg"> <a href="<?php the_permalink() ?>"><?php usces_the_itemImage(0, 150, 150); ?></a> <?php welcart_basic_campaign_message(); ?> </div> <div class="itemprice"><?php usces_the_firstPriceCr(); usces_guid_tax(); ?></div> <?php if(! usces_have_zaiko_anyone() ) : ?> <div class="itemsoldout"><?php _e('Sold Out', 'usces' ); ?></div> <?php endif; ?> <div class="itemname"><a href="<?php the_permalink() ?>" rel="bookmark"><?php usces_the_itemName(); ?></a></div> </article> <?php endwhile; ?> </div> <style> /* ④CSSの出力 */ <?php echo $slug_class;?> article{padding:10px;} <?php echo $slug_class;?> .itemimg img { width: 100%; height: auto; } @media screen and (max-width:768px){.my_relation{margin:0 20px;max-width:100%;}} .slick-prev:before, .slick-next:before{color:'#000';} .slick-track{margin-left:0;} </style> <?php echo <<<EOM <script> /* ⑤Jqueryの出力 */ $(function(){ $('$slug_class').slick({ arrows:true, /* 左右矢印を表示 */ dots:false, /* ドットは非表示 */ infinite:false, /* 無限ループ機能はOFF */ slidesToShow:$pc_num, /* 1行の表示個数(PC) */ slidesToScroll:1, /* スクロール個数 */ swipeToSlide:true, /* スワイプはslidesToScroll値に影響を受けない */ responsive:[{ breakpoint:768,settings:{slidesToShow:$sm_num,}/* 1行の表示個数(スマホ) */ }] }); }); </script> EOM;?> <?php wp_reset_postdata(); /* ⑥WP_Queryのリセット */ } /* functionの終了 */ ?>
①アイコンフォントは「fas fa-grip-lines-vertical」を利用しています。
総ての「Font Awesome」アイコンフォントを利用可能にするの設定をして下さい。
②「wp_query」のパラメータは左記リンク先の解説を参照してください。
尚、価格順の表示方法は商品リストを価格順に並べるカスタマイズを実行して下さい。
③商品リストのクラスはスラグ名を利用します。
また表示部分はwelcart_basicの商品表示プログラムを「wp_query」用に少し変更しました。
④CSSクラスにはスラッグ名から生成した物を利用しています。
⑤「slick.js」のクラスはスラッグ名から生成した物を利用し、設定自体はプログラムで変更する必要がある為、phpプログラムで書きました。
<<<EOMはヒアドキュメントと言われる物で、何行にも渡る長い文章を出力する方法です。次のEOMまでが1つのドキュメントになります。
⑥「 wp_reset_postdata()」は、Wp_Queryのリセット関数で必須です。