Hạn Chế Khi Làm Việc Với WPML Và Cách Fix Ra Sao

Khi làm việc với WPML, mình thấy nó có một hạn chế mà nhà xuất bản plugin đã không fix vấn đề này qua nhiều phiên bản ( cho tới phiên bản hiện tại), cho dù nhiều người dùng có phản ánh trên diễn đàn của WPML trong đó có mình. Và tới hiện tại các website mình đang làm mình mới có hướng giải quyết triệt để vấn đề này. Xin phép chia sẻ với các bạn. Đó là WPML không thể xử lý translate cho link taxonomy được. Ví dụ. Khi mình tạo ra 1 taxonomy để quản lý danh mục dự án,  nó sẽ sinh cho mình 1 slug của link term như sau /project-category/du-an-hien-tai sẽ link tới trang danh sách dự án hiện tại. Nhưng khi sài WPML thì khi có 1 ngôn ngữ thứ 2 là tiếng anh thi link term sẽ là /en/project-category/current-project, như vậy WPML chỉ dịch được term name và term slug.

Mình thực hiện 2 bước để có thể translate

  1. Sử dụng hàm add_rewrite_rule của wordpress
  2. Viết lại term link.Theo dõi đoạn mã bên dưới, thứ nhất mình thêm rule cho link mới
    add_action( 'init', 'wp_init_func' ); 
    function wp_init_func() {
        
        // Add rewrite term
        
        add_rewrite_rule( '^project-category/([^/]+)/?$', 'index.php?project_category=$matches[1]', 'top' );
        add_rewrite_rule( '^project-category/([^/]+)/page/([^/]*)$', 'index.php?project_category=$matches[1]&paged=$matches[2]', 'top' );
    
        add_rewrite_rule( '^danh-muc-du-an/([^/]+)/?$', 'index.php?project_category=$matches[1]', 'top' );
        add_rewrite_rule( '^danh-muc-du-an/([^/]+)/page/([^/]*)$', 'index.php?project_category=$matches[1]&paged=$matches[2]', 'top' );
    
        flush_rewrite_rules();
      }

    Thêm rule mới là link taxonomy 2 ngôn ngữ mà mình đã thêm, kèm theo xử lý rule có phân trang

    Sau đó, mình viết lại term link

    add_filter( 'term_link', 'wp_term_link_func', 10, 3 );
    
      function wp_term_link_func($link, $term, $taxonomy ) {
    
          if( $taxonomy == 'project_category') {
            $linkSlugTranslate = _trans('project_category', 'link');
            $link = str_replace('project_category', $linkSlugTranslate, $link);
          }
          return $link;
      }

    Ở đây mình viết lại term link, với hàm _trans là translate text theo domain theo ngôn ngữ hiện tại
    2 đoạn code trên được lưu trong file functions.php.

Sau này mình sẽ viết thêm 1 plugin để quản lý việc này trên giao diện, hiện tại mình chỉ mô tả hardcode để xử lý việc này.

Như vậy, sau khi xử lý 2 đoạn mã trên thì mình đã có bản translate hoàn chỉnh sau, đối với tiếng việt /danh-muc-du-an/du-an-hien-tai và ngôn ngữ tiếng Anh sẽ là /en/project-category/current-project

Rate this post

You May Also Like

About the Author: truongluu

Leave a Reply

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