Xóa bỏ /product-category/ và /product/ khỏi woocomerce

  1. Xóa bỏ /product-category/

Code xóa bỏ product-category và bỏ toàn bộ slug của danh mục cha ra khỏi đường dẫn tĩnh

Chỉ cần cho đoạn code sau vào file functions.php của theme đang sử dụng. Sau đó vào update lại permalink tại Setting->Permalink->Save Change.

// Remove product cat base
add_filter('term_link', 'devvn_no_term_parents', 1000, 3);
function devvn_no_term_parents($url, $term, $taxonomy) {
    if($taxonomy == 'product_cat'){
        $term_nicename = $term->slug;
        $url = trailingslashit(get_option( 'home' )) . user_trailingslashit( $term_nicename, 'category' );
    }
    return $url;
}
// Add our custom product cat rewrite rules
function devvn_no_product_cat_parents_rewrite_rules($flash = false) {
    $terms = get_terms( array(
        'taxonomy' => 'product_cat',
        'post_type' => 'product',
        'hide_empty' => false,
    ));
    if($terms && !is_wp_error($terms)){
        foreach ($terms as $term){
            $term_slug = $term->slug;
            add_rewrite_rule($term_slug.'/?$', 'index.php?product_cat='.$term_slug,'top');
            add_rewrite_rule($term_slug.'/page/([0-9]{1,})/?$', 'index.php?product_cat='.$term_slug.'&paged=$matches[1]','top');
            add_rewrite_rule($term_slug.'/(?: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_no_product_cat_parents_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);
add_action( 'edit_terms', 'devvn_new_product_cat_edit_success', 10);
add_action( 'delete_term', 'devvn_new_product_cat_edit_success', 10);
function devvn_new_product_cat_edit_success( ) {
    devvn_no_product_cat_parents_rewrite_rules(true);
}

2. Xóa bỏ /product/

  • 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 ạ 🙂
  • 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);

Leave a Reply

Your email address will not be published. Required fields are marked *