10/7/16

Cách phân trang sản phẩm trong Woocommerce -Wordpress

Chào các bạn, ôi thật là vui quá đi. Cái vấn đề này đã làm mình mất hơn 4 tiếng để xử lý nó. Vậy nó là gì ???
Vâng, đa số các bạn làm WordPress chắc không lạ gì với plugin Woocommerce – một plugin đình đám về TMDT (Thương Mại Điện Tử). Có lẽ lí do để mọi người sử dụng Woocommerce nhiều vì nó thật dễ sử dụng, giao diện đẹp, đa dạng về chức năng cũng như có một lượng lớn plugin hỗ trợ Woocommerce.
Quay lại đề nhé,hôm nay mình đang làm một web bán hàng, yêu cầu là phải hiển thị sản phẩm ra trang chủ và đặc biệt phải phân trang. Yes, phải phân trang .Vấn đề đặt ra khi mình thêm shortcode này:
[product_category category="san-pham-toc" per_page="3" columns="3" orderby="default" order="DESC" operator="IN"] 
Các bạn để ý ở tham số per_page có nghĩa là số sản phẩm lấy ra trên một trang. Nó không có nghĩa là sẽ tự động phân trang cho chúng ta. Mình thử viết một Shortcode xem sao nhưng vẫn bị lỗi , không hiện được phân trang. Sử dụng luôn plugin WP-PageNavi theo hướng dẫn này Link – bài viết không giải quyết được vấn đề của mình – vì chức năng chính là thay thế woocommerce_pagination() bằng wp_pagenavi() . Chưa nản chí, mình tìm trên Google rất nhiều từ khoá khác nhau xem sao. và ở trang 5 kết quả tìm kiếm, mình xem thử một đoạn mã. Đúng là thứ mình rất cần, thêm code đó vô file functions.php của theme , vâng nó hoạt động cực kỳ tốt.

<?php
/*
Đặt code này vào file functions.php của theme
Tác giả: klihelp
Fixed by: alexandreleroux
Chức năng: hiển thị phân trang cho sản phẩm WooCommerce khi dùng shortcode riêng lẻ
*/
if ( ! is_admin() ) {
// ---------------------- FRONTPAGE -------------------
if ( defined('WC_VERSION') ) {
// ---------------------- WooCommerce active -------------------
/**
* Set Pagination for shortcodes custom loop on single-pages.
* @uses $woocommerce_loop;
*/
add_action( 'pre_get_posts', 'kli_wc_pre_get_posts_query' );
function kli_wc_pre_get_posts_query( $query ) {
global $woocommerce_loop;
// Get paged from main query only
// ! frontpage missing the post_type
if ( is_main_query() && ( $query->query['post_type'] == 'product' ) || ! isset( $query->query['post_type'] ) ){
if ( isset($query->query['paged']) ){
$woocommerce_loop['paged'] = $query->query['paged'];
}
}
if ( ! $query->is_post_type_archive || $query->query['post_type'] !== 'product' ){
return;
}
$query->is_paged = true;
$query->query['paged'] = $woocommerce_loop['paged'];
$query->query_vars['paged'] = $woocommerce_loop['paged'];
}
/** Prepare Pagination data for shortcodes on pages
* @uses $woocommerce_loop;
**/
add_action( 'loop_end', 'kli_query_loop_end' );
function kli_query_loop_end( $query ) {
if ( ! $query->is_post_type_archive || $query->query['post_type'] !== 'product' ){
return;
}
// Cache data for pagination
global $woocommerce_loop;
$woocommerce_loop['pagination']['paged'] = $woocommerce_loop['paged'];
$woocommerce_loop['pagination']['found_posts'] = $query->found_posts;
$woocommerce_loop['pagination']['max_num_pages'] = $query->max_num_pages;
$woocommerce_loop['pagination']['post_count'] = $query->post_count;
$woocommerce_loop['pagination']['current_post'] = $query->current_post;
}
/**
* Pagination for shortcodes on single-pages
* @uses $woocommerce_loop;
*/
add_action( 'woocommerce_after_template_part', 'kli_wc_shortcode_pagination' );
function kli_wc_shortcode_pagination( $template_name ) {
if ( ! ( $template_name === 'loop/loop-end.php' && is_page() ) ){
return;
}
global $wp_query, $woocommerce_loop;
if ( ! isset( $woocommerce_loop['pagination'] ) ){
return;
}
$wp_query->query_vars['paged'] = $woocommerce_loop['pagination']['paged'];
$wp_query->query['paged'] = $woocommerce_loop['pagination']['paged'];
$wp_query->max_num_pages = $woocommerce_loop['pagination']['max_num_pages'];
$wp_query->found_posts = $woocommerce_loop['pagination']['found_posts'];
$wp_query->post_count = $woocommerce_loop['pagination']['post_count'];
$wp_query->current_post = $woocommerce_loop['pagination']['current_post'];
// Custom pagination function or default woocommerce_pagination()
kli_woocommerce_pagination();
}
/**
* Custom pagination for WooCommerce instead the default woocommerce_pagination()
* @uses plugin Prime Strategy Page Navi, but added is_singular() on #line16
**/
remove_action('woocommerce_after_shop_loop', 'woocommerce_pagination', 10);
add_action( 'woocommerce_after_shop_loop', 'kli_woocommerce_pagination', 10);
function kli_woocommerce_pagination() {
woocommerce_pagination();
}
}/*woocommerce*/
}/*frontpage*/

Xin chia sẽ cho các bạn tham khảo. Hy vọng ở phiên bản tiếp theo của Woocommerce tích hợp được như thế này.

Cách 2
Thử đoạn này nhé:

function jam_repage_category( $q ) {
    if ( $q->is_main_query() && $q->is_category() && ! is_admin() ) {
        $cat = get_query_var('cat');
        if ( $cat = 123 )
            $q->set('posts_per_page', '6');
    }
}
add_action( 'pre_get_posts', 'jam_repage_category' );
Nguồn: nguyenphucgialinh

0 nhận xét: