![]() |
| Shopping Cart |
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; ?>



:)
:(
:))
:((
=))
=D>
:D
:P
:-O
:-?
:-SS
:-t
[-(
@-)
b-(
bai viet rat hay minh tim mai ma khong thay. gio bat tay vao thuc hanh thoi xem ket qua co dung khong
ReplyDeletehix hix sao ap dụng vào lai đâu có thấy chạy :((
ReplyDeleteBạn có thể ghi rõ hơn là gặp lỗi gì ko>
ReplyDeleteđường dẫn http://localhost/truongsonwp/vi/gio-hang/them/108 này lỗi 404 bạn ah
ReplyDeletebạn vào wordpress chỉnh lại cái Permalink: post-name trước nha, sau đó thử lại.
Deletehì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
ReplyDeletekhi đă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
bạn thay function trên thành đoạn dưới và thử lại nhé.
Deleteadd_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 ();
}
href="/gio-hang/them/" class="add_to_cart">Mua ngay
DeleteTrang 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
This comment has been removed by the author.
ReplyDeletecho xin video hướng dẫn được không cần lắm mà đọc làm theo nó không ăn.
Deletecho một hướng dẫn củ thê hơn nữa cho con gà này với!
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/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?
ReplyDeleteCủa mình giờ nó không báo lỗi nữa, nhưng nó hiện mỗi như này "
ReplyDeleteHiệ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.
"
Hay lắm, cảm ơn bạn rất nhiều
ReplyDeleteOk bài hay lắm.
ReplyDeletecode thêm cái đơn hàng và quản lý trong admin luôn bạn.