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:
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:
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
Sau khi làm xong hãy lưu lại và kiểm tra các đường dẫn:
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 abweb.vn - 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)
Chúc các bạn thành công!