Tối ưu URL WooCommerce: Đồng bộ hóa đường dẫn sản phẩm và danh mục
Việc cấu hình đường dẫn (permalinks) trên website WooCommerce không chỉ ảnh hưởng đến trải nghiệm người dùng mà còn là yếu tố then chốt trong chiến lược SEO. Bài viết này sẽ đi sâu phân tích cách đồng bộ hóa đường dẫn trang sản phẩm và danh mục, loại bỏ các slug mặc định không cần thiết, và giải thích ý nghĩa sâu xa của việc này đối với hiệu suất trang web của bạn.
Tại sao đồng bộ hóa đường dẫn sản phẩm và danh mục lại quan trọng?
Việc có cấu trúc URL nhất quán và gọn gàng, ví dụ như your-domain.com/san-pham/ten-danh-muc thay vì your-domain.com/product-category/ten-danh-muc, mang lại nhiều lợi ích đáng kể:
- Cải thiện SEO: Đường dẫn ngắn gọn, chứa từ khóa chính và không bị lặp từ khóa giúp công cụ tìm kiếm dễ dàng hiểu cấu trúc trang web và mức độ liên quan của nội dung. Nó cũng tránh tình trạng “keyword cannibalization” (nuốt chửng từ khóa) giữa các slug
productvàproduct-category. - Nâng cao trải nghiệm người dùng (UX): URL dễ đọc, dễ nhớ và dễ chia sẻ. Người dùng có thể dễ dàng hình dung cấu trúc website và vị trí của mình trong hệ thống phân cấp sản phẩm.
- Tăng tính chuyên nghiệp: Một cấu trúc URL rõ ràng thể hiện sự chỉnh chu và chuyên nghiệp của website, tạo ấn tượng tốt hơn với khách truy cập.

Các bước cấu hình và ý nghĩa kỹ thuật
Để đạt được cấu trúc đường dẫn mong muốn, chúng ta cần thực hiện các bước cấu hình và can thiệp mã nguồn:
1. Chuẩn bị trang Shop và Permalink cơ bản
Đầu tiên, bạn cần đảm bảo đã có một trang tĩnh được chỉ định làm trang Shop của WooCommerce. Trang này nên có slug ngắn gọn, dễ hiểu, ví dụ san-pham.
- Tạo trang Shop: Tạo một trang WordPress mới với tiêu đề “Sản phẩm” và slug là
san-pham.

- Thiết lập trang Shop cho WooCommerce: Trong cài đặt WooCommerce, chọn trang vừa tạo làm trang Shop.

Tiếp theo, bạn cần cấu hình lại Permalinks trong WordPress:
- Product category base: Đặt là
san-pham. - Custom base: Đặt là
/san-pham/%product_cat%.
Cài đặt này sẽ thay thế slug product-category mặc định bằng san-pham, đồng thời tích hợp danh mục sản phẩm vào cấu trúc đường dẫn của trang Shop.

2. Giải quyết lỗi 404 cho trang danh mục sản phẩm
Sau khi cấu hình trên, bạn có thể gặp lỗi 404 cho các trang danh mục sản phẩm. Điều này xảy ra vì WordPress cần được “dạy” cách nhận diện và xử lý cấu trúc URL mới này. Đoạn mã PHP sau đây được chèn vào file functions.php của theme đang sử dụng để khắc phục vấn đề này:
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');
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);
}
add_rewrite_rule(): Hàm này là cốt lõi của giải pháp. Nó đăng ký các quy tắc viết lại URL tùy chỉnh vào hệ thống WordPress. Cụ thể, nó thông báo cho WordPress rằng khi gặp một URL có dạng/san-pham/ten-danh-muc, hãy xử lý nó như một truy vấn đến trang danh mục sản phẩm với slug tương ứng (index.php?product_cat=ten-danh-muc).get_terms()vàget_term_link(): Đoạn code này tự động lặp qua tất cả các danh mục sản phẩm hiện có và tạo ra các quy tắc viết lại riêng biệt cho từng danh mục. Điều này đảm bảo tính linh hoạt và khả năng mở rộng khi bạn thêm mới hoặc chỉnh sửa danh mục.flush_rewrite_rules(false): Hàm này cập nhật lại các quy tắc viết lại của WordPress. Việc gọi nó sau khi thêm code và đặc biệt là sau khi tạo danh mục mới là cực kỳ quan trọng để các thay đổi có hiệu lực và tránh lỗi 404.create_termhook: Đảm bảo rằng mỗi khi một danh mục sản phẩm mới được tạo, các quy tắc viết lại sẽ được làm mới, ngăn ngừa lỗi 404 cho các danh mục mới ngay từ đầu.
3. Hỗ trợ đa ngôn ngữ với WPML
Đối với các website đa ngôn ngữ sử dụng WPML, việc cấu hình permalink trở nên phức tạp hơn do mỗi ngôn ngữ có thể có các slug riêng. Đoạn mã nâng cao sau đây giải quyết vấn đề này bằng cách chuyển đổi ngôn ngữ tạm thời để tạo các quy tắc viết lại chính xác cho từng phiên bản ngôn ngữ:
/* 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');
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);
}
$sitepress->switch_lang($new_lang): Đây là điểm mấu chốt. Code sẽ lặp qua từng ngôn ngữ được cấu hình trong WPML, tạm thời chuyển đổi ngôn ngữ đểget_term_link()và các hàm liên quan trả về đường dẫn chính xác cho từng ngôn ngữ.apply_filters( 'wpml_home_url', get_home_url('/') ): Đảm bảo rằng URL gốc của trang web được lấy một cách chính xác, có tính đến cấu hình URL của WPML (ví dụ,/en/cho tiếng Anh).
Kết luận
Việc đồng bộ hóa đường dẫn trang sản phẩm và danh mục trong WooCommerce không chỉ là một thủ thuật cấu hình đơn giản mà là một chiến lược tối ưu hóa toàn diện. Nó cải thiện đáng kể khả năng tìm kiếm của trang web trên các công cụ như Google, mang lại trải nghiệm điều hướng mượt mà cho người dùng, và tạo nên một cấu trúc website chuyên nghiệp, dễ quản lý. Bằng cách hiểu rõ “tại sao” và “cách thức” hoạt động của các quy tắc viết lại URL, bạn có thể tự tin áp dụng và duy trì một hệ thống permalink hiệu quả cho website WooCommerce của mình. Hãy luôn nhớ làm mới các quy tắc permalink sau bất kỳ thay đổi lớn nào trong cấu trúc danh mục để đảm bảo mọi thứ hoạt động trơn tru.




