Cách cài đặt base của danh mục sản phẩm giống với base của trang sản phẩm

Thêm một bài viết nữa liên quan tới đường dẫn của woocommerce mà mình muốn chia sẻ với mọi người. Trước đây mình có viết bài Hướng dẫn xóa product, product-category trong đường dẫn của woocommerce để có thể loại bỏ chữ product và product-category khỏi đường dẫn.

Các bài viết có thể bạn quan tâm:

Để duy trì blog nên mình có làm aff cho 1 số bên hosting. Nhưng dù aff mình cũng chọn 1 số nhà cung cấp uy tín về chất lượng và support nên các bạn cứ yên tâm nhé.

Nếu có mua hosting mà có trong list dưới đây các bạn click vào link trước khi mua để ủng hộ mình nhé. Mình cảm ơn nhiều

  1. Xóa bỏ product-category và toàn bộ slug của danh mục cha khỏi đường dẫn của Woocommerce 
  2. Hướng dẫn xóa product, product-category trong đường dẫn của woocommerce

Nhưng hôm nay lại khác. Mình sẽ không xóa nó đi nữa, thay vào đó sẽ cài đặt để cho base của danh mục sản phẩm giống với base của trang sản phẩm. Cụ thể sau khi làm xong bài này chúng ta sẽ như sau:

  • Trang sản phẩm: http://your-domain.com/san-pham
  • Trang danh mục: http://your-domain.com/san-pham/mon-khai-vi
  • Trang chi tiết: http://your-domain.com/san-pham/mon-khai-vi/canh-ga-nuong

Trước tiên bạn phải chắc chắn mình đã có 1 Page Sẩn phẩm với slug là san-pham

và đặt page đó làm trang Shop của Woocommerce

Tiếp theo là cách cài đặt để được dạng đường dẫn như trên. Bạn vào Setting / Permalink. Tại đây bạn sẽ cài đặt như sau

  • Product category base: san-pham
  • Custom base: /san-pham/%product_cat%

Sau khi làm xong hãy lưu lại và kiểm tra các đường dẫn:

  • Trang sản phẩm: http://your-domain.com/san-pham (Đã làm việc)
  • Trang danh mục: http://your-domain.com/san-pham/mon-khai-vi (Lỗi 404)
  • Trang chi tiết: http://your-domain.com/san-pham/mon-khai-vi/canh-ga-nuong (Đã làm việc)

Vậy làm sao để sửa lỗi 404. Đoạn code sau sẽ giải quyết được vấn đề lỗi 404 tại trang danh mục. Bạn chèn đoạn code này vào file functions.php của theme đang sử dụng

function devvn_product_category_base_same_shop_base( $flash = false ){
    $terms = get_terms(array(
        'taxonomy' => 'product_cat',
        'post_type' => 'product',
        'hide_empty' => false,
    ));
    if ($terms && !is_wp_error($terms)) {
        $siteurl = esc_url(home_url('/'));
        foreach ($terms as $term) {
            $term_slug = $term->slug;
            $baseterm = str_replace($siteurl, '', get_term_link($term->term_id, 'product_cat'));

            add_rewrite_rule($baseterm . '?$','index.php?product_cat=' . $term_slug,'top');
            add_rewrite_rule($baseterm . 'page/([0-9]{1,})/?$', 'index.php?product_cat=' . $term_slug . '&paged=$matches[1]','top');
            add_rewrite_rule($baseterm . '(?:feed/)?(feed|rdf|rss|rss2|atom)/?$', 'index.php?product_cat=' . $term_slug . '&feed=$matches[1]','top');

        }
    }
    if ($flash == true)
        flush_rewrite_rules(false);
}
add_filter( 'init', 'devvn_product_category_base_same_shop_base');

/*Sửa lỗi khi tạo mới taxomony bị 404*/
add_action( 'create_term', 'devvn_product_cat_same_shop_edit_success', 10, 2 );
function devvn_product_cat_same_shop_edit_success( $term_id, $taxonomy ) {
    devvn_product_category_base_same_shop_base(true);
}

Sau khi thêm code vào file functions.php hãy vào lại Setting / Permalink để update lại Permalink một lần nữa (Save change) Vậy là đã xong!

UPDATE 25/02/2019 – Support WPML

/* Author levantoan.com - Support WPML*/
function devvn_product_category_base_same_shop_base( $flash = false ){
    global $sitepress;
    $languages = icl_get_languages('skip_missing=0&orderby=code');
    if($languages && !empty($languages)){
        $original_lang = ICL_LANGUAGE_CODE;
        foreach($languages as $key=>$lang) {
            $new_lang = $key;
            $sitepress->switch_lang($new_lang);
            $terms = get_terms(array(
                'taxonomy' => 'product_cat',
                'post_type' => 'product',
                'hide_empty' => false,
            ));
            if ($terms && !is_wp_error($terms)) {
                $siteurl = apply_filters( 'wpml_home_url', get_home_url('/'));
                $siteurl = ($sitepress->get_default_language() == $key) ? $siteurl.'/' : $siteurl;
                foreach ($terms as $term) {
                    $term_slug = $term->slug;
                    $baseterm = str_replace($siteurl, '', get_term_link($term->term_id, 'product_cat'));
                    add_rewrite_rule($baseterm . '?$', 'index.php?product_cat=' . $term_slug, 'top');
                    add_rewrite_rule($baseterm . 'page/([0-9]{1,})/?$', 'index.php?product_cat=' . $term_slug . '&paged=$matches[1]', 'top');
                    add_rewrite_rule($baseterm . '(?:feed/)?(feed|rdf|rss|rss2|atom)/?$', 'index.php?product_cat=' . $term_slug . '&feed=$matches[1]', 'top');
                }
            }
            $sitepress->switch_lang($original_lang);
        }

    }

    if ($flash == true)
        flush_rewrite_rules(false);
}
add_filter( 'init', 'devvn_product_category_base_same_shop_base');

/*Sửa lỗi khi tạo mới taxomony bị 404*/
add_action( 'create_term', 'devvn_product_cat_same_shop_edit_success', 10, 2 );
function devvn_product_cat_same_shop_edit_success( $term_id, $taxonomy ) {
    devvn_product_category_base_same_shop_base(true);
}

 

Chú ý: Nếu có phát sinh lỗi hãy comment để mình sửa nhé 🙂

Keyword: (Thank Dale Mounsey)

  • Same permalink for WooCommerce shop and Category
  • Custom permalink WooCoomerce shop and Category
  • How to have the same shop base and category base in WooCommerce
  • Permalinks the same for shop and category in WooCoomerce
  • Same Permalink for Shop, Category, Custom Base with Child Cats

Chúc các bạn thành công!

5/5 - (19 votes)
  • Bình luận
Sản phẩm nổi bật của Toản
x