Home » » Tạo giỏ hàng trong wordpress đơn giản

Tạo giỏ hàng trong wordpress đơn giản

Unknown | 3:54 PM | 15comments
Shopping Cart
Cách làm thì có rất nhiều, nhưng trong khuôn khổ bài viết này mình sẽ hướng dẫn các bạn tạo giỏ hàng bằng session. Như các bạn cũng đã biết là session được lưu trên server và nó bắt đầu khi người dùng truy cập vào website. Mỗi session sẽ có 1 định danh riêng là ID vì thế mình có thể sử dụng session để tạo ra giỏ hàng và giỏ hàng này là dành riêng cho mỗi người dùng. Rất thuận lợi để phân biệt giỏ hàng của người dùng.
Cụ thể là mình sẽ tạo ra 1 session với tên là shopcart chẳng hạn. Session này mình sẽ dùng để lưu 1 mảng các giá trị với key là id của sản phẩm và value là số lượng sản phẩm. Dùng phương pháp lưu vào session kiểu này mình thấy rất hay thay vì phải lưu xuống cơ sở dữ liệu vì vừa phải chèn, xóa, cập nhật csdl rất mất công. Ngoài ra dùng giỏ hàng với session các bạn không phải lo vấn đề xóa giỏ hàng vì nó sẽ tự động hủy khi người dùng thoát khỏi website.
Ý tưởng đã xong, giờ tiến hành thôi. Mình sẽ sử dụng 1 template page duy nhất để hiển thị, thêm và xóa sản phẩm trong giỏ hàng. Các bạn tạo 1 template page với tên tùy ý và kích hoạt nó. Ở đây mình tạo 1 file cart.php và kích hoạt nó với page có tên Giỏ Hàng. Các bạn nhớ slug của page này nhé. Mình sẽ dùng nó ở dưới đấy, của mình là gio-hang.

Đầu tiên vào functions.php để đăng ký 2 query_var để truyền thao tác (thêm | xóa) và ID sản phẩm nhé

function insert_query_vars($vars) {
 array_push($vars, 'pro_id'); //lưu id sản phẩm
 array_push($vars, 'action'); //lưu thao tác (thêm, xóa)
 return $vars;
}
add_filter('query_vars', 'insert_query_vars');


Tiếp theo đăng ký 1 rules mới để rewite đường dẫn trang web khi thêm sản phẩm

function rewrite_rules($rules) {
 $new_rules = array();
 $new_rules['(gio-hang)/(them|xoa)/([0-9]+)/?'] = 'index.php?pagename=$matches[1]&action=$matches[2]&pro_id=$matches[3]';
 return $new_rules + $rules;
 echo $matches[2];

}
add_action('rewrite_rules_array', 'rewrite_rules'); 

Tiếp đến thêm link vào button thêm vào giỏ hàng:
  <a href="<?php bloginfo('url'); ?>/gio-hang/them/<?php echo get_the_ID(); ?>" class="add_to_cart">Mua ngay</a>

Rồi, bây giờ các bạn quay lại template page đã tạo ở trên để viết code xử lý thêm, xóa, cập nhật và hiển thị sản phẩm trong giỏ. Các bạn gọi header, sidebar và footer cho phù hợp với theme. Vì bài viết này mình hướng dẫn cách xử lý giỏ hàng nên các phần về  hiển thị mình không giải thích nữa. Mình chỉ tập trung vào cách xử lý thêm, xóa, cập nhật giỏ hàng như thế nào thôi. Và đây là nội dung trang xử lý:


 <?php
 /*
 Template Name: Cart
 */
?>

<?php
 global $product_prefix;
 $action = get_query_var('action'); //thêm|xóa
 $pro_id = get_query_var('pro_id'); //id sản phẩm
 if($action){ //nếu có thao tác (thêm hoặc xóa)
  switch($action){
   case 'them':
    if (isset( $_SESSION['cart'][$pro_id])) //nếu đã có thì cập nhật số lượng thêm 1
     $quantity = $_SESSION['cart'][$pro_id] + 1;
    else
     $quantity = 1; //ngược lại tạo 1 item mới với số lượng là 1
    $_SESSION['cart'][$pro_id] = $quantity; //cập nhật lại
    wp_redirect(get_bloginfo('url').'/gio-hang'); exit(); //trả về trang hiển thị giỏ hàng
    break;
   case 'xoa':
    if(isset( $_SESSION['cart'] ) && count( $_SESSION['cart'] ) > 0 ){ //kiểm tra và xóa sản phẩm dựa vào id
     unset($_SESSION['cart'][$pro_id]);
     wp_redirect(get_bloginfo('url').'/gio-hang'); exit();
    }
    else{
     unset($_SESSION['cart']);
     echo "<h3>Hiện chưa có sản phẩm nào trong giỏ hàng! <a href='".get_bloginfo('url')."'>Bấm vào đây</a> để xem và mua hàng.</h3>";
    }
   break;
 }
 }else{ //không có thao tác thêm hoặc xóa thì sẽ hiển thị sản phẩm trong giỏ hàng
 ?>
 <?php
 if ( isset( $_SESSION['cart'] ) && count( $_SESSION['cart'] ) > 0 ) { //kiểm tra số lượng sản phẩm trước khi hiển thị
 ?>
  <form action="" method="post">
   <table id="cart">
    <tr>
     <td style="width:50px;"></td>
     <td>Tên sản phẩm</td>
     <td>Giá</td>
     <td>Số lượng</td>
     <td>Thành tiền</td>
     <td><input type="submit" name="cart_update" value="Cập nhật" style="border: 1px solid olive; cursor: pointer;"
 title="Cập nhật giỏ hàng"/></td>
    </tr>
 <?php
 $total = 0;
 foreach ( $_SESSION['cart'] as $pro_id => $quantity ){ //lặp qua mảng cart session lấy ra id và show thông tin sản phẩm theo id đó
  $product = get_post((int)$pro_id );
  $price = (float)get_post_meta($pro_id, $product_prefix."price",true);
 ?>
  <tr>
  <td style="width:50px;"><?php if ( has_post_thumbnail( $pro_id ) ) echo get_the_post_thumbnail( $pro_id, array( 50, 50 ) ); else echo "<img src='".get_bloginfo('template_url')."/images/no_img.png' style='width:50px;height:50px;' />"; ?></td>
  <td><?php echo $product->post_title; ?></td>
  <td><?php echo number_format($price). ' VND'; ?></td>
  <td><input autocomplete="off" type="text" value="<?php echo $quantity; ?>" name="quantity[<?php echo $pro_id; ?>]" /></td>
  <td><?php echo number_format( $price * $quantity) . ' VND'; ?></td>
  <?php $total += $price * $quantity; ?>
  <td><a href="<?php echo get_bloginfo( 'url' ) . '/gio-hang/xoa/' . $pro_id; //link xóa sản phẩm trong giỏ ?>">Xóa</a>
 </td>
 </tr>
 <?php
 }
 ?>
 <tr>
 <td colspan="2">
 <a title="Mua tiếp" class="btn" href="<?php echo get_bloginfo( 'url' ); ?>">Mua tiếp</a>
 <a title="Đặt hàng" class="btn" href="#">Đặt hàng</a>
 </td>
 <td>Tổng tiền</td>
 <td colspan="3"><?php echo number_format($total) . ' VND'; ?></td>
 </tr>
 </table>
 </form>
 <?php
 } else {
 echo "<h2>Hiện chưa có sản phẩm nào trong giỏ hàng! <a href='" . get_bloginfo( 'url' ) . "'>Bấm vào đây</a> để xem và mua hàng.</h2>";
 }
 ?>
 <?php
 if(isset($_POST['cart_update'])){ //xử lý cập nhật giỏ hàng
  if(isset($_POST['quantity'])){
   if(count($_SESSION['cart']) == 0) unset($_SESSION['cart']); //nếu không còn sản phẩm trong giỏ thì xóa giỏ hàng
   foreach($_POST['quantity'] as $pro_id => $quantity){ //lặp mảng số lượng mới và cập nhật mới cho giỏ hàng
     if($quantity == 0) unset($_SESSION['cart'][$pro_id]);
     else $_SESSION['cart'][$pro_id] = $quantity;
   }
   wp_redirect(get_bloginfo( 'url' ).'/gio-hang'); //cập nhật xong trả về trang hiển thị sản phẩm trong giỏ
  }
 }
 }
 ?>

Trên code cũng đã ghi chú khá đầy đủ nên mình cũng không giải thích lại nữa nhớ thêm css cho trang giỏ hàng thêm sinh động nhé


Tiếp theo đăng ký session

add_action( ‘init’, ‘start_session’ );
function dvd_start_session() {
if ( !session_id() ) {
session_start();
}
}

và đây là kết quả của mình sau khi thêm css:

Cuối cùng là đặt đoạn code này nơi muốn hiển thị giỏ hàng 
<h3 class="cart"><a href="<?php bloginfo('url'); ?>/gio-hang" >Giỏ hàng </a><?php if(isset($_SESSION['cart']) && count($_SESSION['cart']) > 0) echo "(".count($_SESSION['cart']).")"; ?></h3>
 <?php if(!isset($_SESSION['cart']) || (isset($_SESSION['cart']) && count($_SESSION['cart']) == 0)) : ?>
 <p>Hiện chưa có sản phẩm nào trong giỏ hàng.</p>
 <?php else : ?>
 <?php
 global $product_prefix; $price_total = 0;
 foreach($_SESSION['cart'] as $pro_id => $quantity){ //lặp và hiển thị thông tin sản phẩm trong giỏ
 $product = get_post($pro_id);
 ?>
 <li><a title="<?php echo $product->post_title; ?>" href="<?php echo get_permalink($pro_id); ?>"><?php echo substr($product->post_title, 15); ?></a> x <?php echo $quantity; ?><br/>
 <?php $price = get_post_meta($pro_id, $product_prefix."price", true);
 if($price && $price != "") {
 echo ' => '.number_format((float)$price * $quantity) .' VND'; $price_total += ((float)$price * $quantity);
 }
 else echo " => 0 VND";
 ?>
 </li>
 <?php
 }
 echo "<hr/>"; echo "Tổng tiền: ".number_format($price_total)." VND";
 ?>
 <?php endif; ?>

Share this article :

15 comments:

  1. bai viet rat hay minh tim mai ma khong thay. gio bat tay vao thuc hanh thoi xem ket qua co dung khong

    ReplyDelete
  2. hix hix sao ap dụng vào lai đâu có thấy chạy :((

    ReplyDelete
  3. Bạn có thể ghi rõ hơn là gặp lỗi gì ko>

    ReplyDelete
  4. đường dẫn http://localhost/truongsonwp/vi/gio-hang/them/108 này lỗi 404 bạn ah

    ReplyDelete
    Replies
    1. bạn vào wordpress chỉnh lại cái Permalink: post-name trước nha, sau đó thử lại.

      Delete
  5. hình như wordpress không còn hỗ trợ session nữa phải ko bạn mình làm nó báo lỗi
    khi đăng ký Function dvd_start_session. xin bạn hướng dẫn giúp cảm ơn bạn

    Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'start_session' not found or invalid function name in C:\xampp\htdocs\wordpress\wp-includes\plugin.php on line 496

    ReplyDelete
    Replies
    1. bạn thay function trên thành đoạn dưới và thử lại nhé.

      add_action('init', 'mySessionStart', 1);
      add_action('wp_logout', 'mySessionEnd');
      add_action('wp_login', 'mySessionEnd');

      function mySessionStart() {
      if(!session_id()) {
      session_start();
      }
      }
      function mySessionEnd() {
      session_destroy ();
      }

      Delete
    2. href="/gio-hang/them/" class="add_to_cart">Mua ngay

      Trang thẻ a trên có "/them" sau "/gio-hang" là như nào vậy bạn? mình áp dụng nó toàn báo lỗi

      Delete
  6. This comment has been removed by the author.

    ReplyDelete
    Replies
    1. cho xin video hướng dẫn được không cần lắm mà đọc làm theo nó không ăn.
      cho một hướng dẫn củ thê hơn nữa cho con gà này với!

      Delete
  7. Bạn ơi, cho mình hỏi phần "Tiếp theo đăng ký session" là viết trong file nào vậy?

    ReplyDelete
  8. /gio-hang/them/ Bạn ơi, cho mình hỏi trong thẻ a đó có "/them" là như nào vậy? phải tạo thêm một page là them và là con của page gio-hang sao?

    ReplyDelete
  9. Của mình giờ nó không báo lỗi nữa, nhưng nó hiện mỗi như này "
    Hiện chưa có sản phẩm nào trong giỏ hàng! Bấm vào đây để xem và mua hàng.
    Giỏ hàng

    Hiện chưa có sản phẩm nào trong giỏ hàng.
    "

    ReplyDelete
  10. Hay lắm, cảm ơn bạn rất nhiều

    ReplyDelete
  11. Ok bài hay lắm.
    code thêm cái đơn hàng và quản lý trong admin luôn bạn.

    ReplyDelete

:) :( :)) :(( =))


BÀI ĐĂNG MỚI

COMMENT

 
Text link : Xem Phim | Giải Trí | Mas Template
Copyright © 2014. SharePHP - All Rights Reserved
Template Modify by Dang Son
Proudly powered by Blogger