Hướng dẫn xóa product, product-category trong URL của Woocommerce WordPress

Hướng dẫn xóa product, product-category trong URL của Woocommerce WordPress

Nhiều khách hàng có yêu cầu xóa bỏ chữ product hoặc product-category trong đường dẫn mặc định của woocommerce. Thấy bảo thân thiện với seo gì gì ? mình không rõ lắm vấn đề đó. Chỉ biết hướng dẫn bỏ đi thôi ?

Khi bỏ đi cũng có cái hay là đường dẫn sẽ được rút ngắn. Nhưng bên cạnh đó cũng có 1 số bất cập là phải chú ý khi đăng sản phẩm đường dẫn không được trùng với bài viết, page hay bất khi post type khác.

Hướng dẫn loại bỏ chữ product trong đường dẫn

Trước tiên các bạn dán đoạn code sau vào file functions.php của theme đang sử dụng. Sau đó hãy update lại permalink (Setting -> Permalinks -> Save changes) và thưởng thức thành quả.

Chú ý:

  1. Copy và dán đúng cú pháp PHP. Nhiều bạn có cái dấu mở PHP (<?php) tống cả vào mà không để ý rồi lỗi cả web cứ inbox bảo code làm sao … em buồn lắm các bác ạ ?
  2. Tại dòng số 11 trong code bên dưới đang để là /cua-hang/ các bạn thay chữ đó thành slug hiện tại của web… vào Setting -> Permalink để kiểm tra slug hiện tại là gì (thường là /product/ hoặc /shop/ …)

/*
* Code Bỏ /product/ hoặc /cua-hang/ hoặc /shop/ ... có hỗ trợ dạng %product_cat%
* Thay /cua-hang/ bằng slug hiện tại của bạn
*/
function devvn_remove_slug( $post_link, $post ) {
if ( !in_array( get_post_type($post), array( 'product' ) ) || 'publish' != $post->post_status ) {
return $post_link;
}
if('product' == $post->post_type){
$post_link = str_replace( '/cua-hang/', '/', $post_link ); //Thay cua-hang bằng slug hiện tại của bạn
}else{
$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
}
return $post_link;
}
add_filter( 'post_type_link', 'devvn_remove_slug', 10, 2 );
/*Sửa lỗi 404 sau khi đã remove slug product hoặc cua-hang*/
function devvn_woo_product_rewrite_rules($flash = false) {
global $wp_post_types, $wpdb;
$siteLink = esc_url(home_url('/'));
foreach ($wp_post_types as $type=>$custom_post) {
if($type == 'product'){
if ($custom_post->_builtin == false) {
$querystr = "SELECT {$wpdb->posts}.post_name, {$wpdb->posts}.ID
FROM {$wpdb->posts}
WHERE {$wpdb->posts}.post_status = 'publish'
AND {$wpdb->posts}.post_type = '{$type}'";
$posts = $wpdb->get_results($querystr, OBJECT);
foreach ($posts as $post) {
$current_slug = get_permalink($post->ID);
$base_product = str_replace($siteLink,'',$current_slug);
add_rewrite_rule($base_product.'?$', "index.php?{$custom_post->query_var}={$post->post_name}", 'top');
add_rewrite_rule($base_product.'comment-page-([0-9]{1,})/?$', 'index.php?'.$custom_post->query_var.'='.$post->post_name.'&cpage=$matches[1]', 'top');
add_rewrite_rule($base_product.'(?:feed/)?(feed|rdf|rss|rss2|atom)/?$', 'index.php?'.$custom_post->query_var.'='.$post->post_name.'&feed=$matches[1]','top');
}
}
}
}
if ($flash == true)
flush_rewrite_rules(false);
}
add_action('init', 'devvn_woo_product_rewrite_rules');
/*Fix lỗi khi tạo sản phẩm mới bị 404*/
function devvn_woo_new_product_post_save($post_id){
global $wp_post_types;
$post_type = get_post_type($post_id);
foreach ($wp_post_types as $type=>$custom_post) {
if ($custom_post->_builtin == false && $type == $post_type) {
devvn_woo_product_rewrite_rules(true);
}
}
}
add_action('wp_insert_post', 'devvn_woo_new_product_post_save');

Mình sẽ giải thích 1 chút xíu về hàm trên. Function devvn_remove_slug hook vào post_type_link  sẽ giúp chúng ta xóa bỏ chữ product trong đường dẫn. Nhưng khi truy cập vào đường dẫn đó sẽ bị 404 vì vậy ta phải có thêm function devvn_woo_rewrite_rules để rewrite, sẽ không còn bị 404 nữa.

Chú ý: Mặc định slug là product. Nhưng có thể slug đó đã bị thay đổi trước đó. bạn hãy kiểm tra xem slug hiện tại là gì rồi thay vào phía trên cho đúng nhé.

Hướng dẫn loại bỏ chữ product-category trong đường dẫn KHÔNG cần plugin

Bạn chỉ cần copy đoạn code sau vào file functions.php của theme đang sử dụng sau đó vào update lại permalink (Setting -> Permalink -> Save change) là có thể xóa bỏ dc chữ product-category ra khỏi đường dẫn rồi.

Chú ý:

  1. Cú pháp PHP khi copy
  2. Tại dòng 10 code dưới áp dụng cho slug danh mục là “product-category”. Hãy thay slug đó thành slug hiện tại của web bạn (Vào Setting -> Permalink để kiểm tra)

/*
* Remove product-category in URL
* Thay product-category bằng slug hiện tại của bạn. Mặc định là product-category
*/
add_filter( 'term_link', 'devvn_product_cat_permalink', 10, 3 );
function devvn_product_cat_permalink( $url, $term, $taxonomy ){
switch ($taxonomy):
case 'product_cat':
$taxonomy_slug = 'product-category'; //Thay bằng slug hiện tại của bạn. Mặc định là product-category
if(strpos($url, $taxonomy_slug) === FALSE) break;
$url = str_replace('/' . $taxonomy_slug, '', $url);
break;
endswitch;
return $url;
}
// Add our custom product cat rewrite rules
function devvn_product_category_rewrite_rules($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_action('init', 'devvn_product_category_rewrite_rules');
/*Sửa lỗi khi tạo mới taxomony bị 404*/
add_action( 'create_term', 'devvn_new_product_cat_edit_success', 10, 2 );
function devvn_new_product_cat_edit_success( $term_id, $taxonomy ) {
devvn_product_category_rewrite_rules(true);

Chú ý: Nếu sau khi làm xong mà bị lỗi phân trang (/page/2 – 404 not found) là do ở phần permalink của Posts có dạng .html. Các bạn sửa như sau

Sửa code dòng 30,31 ở trên thành đoạn này

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');

Hướng dẫn loại bỏ chữ product-category trong đường dẫn bằng plugin

Ngoài cách không dùng plugin ở trên có thể dùng plugin. Chúng ta dùng plugin WP htaccess Control để loại bỏ chữ product-category khỏi đường dẫn. Sau khi cài đặt các bạn hãy chọn như hình bên dưới rồi save lại là okie nhé

Hướng dẫn xóa product, product-category trong URL của Woocommerce WordPress

Chú ý: Sau khi xóa bằng code bên trên đã thành công nhưng sẽ có 2 link tồn tại. Ví dụ domain/san-pham/dien-thoai và domain/dien-thoai .

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