Thứ Bảy, 4 tháng 4, 2015

Trang hỗ trợ độc giả của ThachPham.Com

Chào mọi người,

Sau một thời gian dài suy nghĩ, mình đã quyết định làm lại một forum có chức năng hỗ trợ giải đáp các vấn đề mà độc giả gặp phải khi xem bài viết hoặc các vấn đề xảy ra khi sử dụng WordPress, Hosting – Server,….v…v…Thực ra việc này không có gì mới vì trước đây mình cũng đã có làm một forum nhưng lúc đó lại không duy trì được bao lâu vì chưa thấy sự cần thiết, nhưng bây giờ thì chắc chắn việc này khá cần thiết.

Ngay bây giờ, mọi người có thể truy cập vào địa chỉ hoidap.thachpham.com để đăng các câu hỏi lên và mình hoặc những người khác sẽ trả lời. Ngay mỗi bài, bạn có thể chọn các bình luận thành câu trả lời hay nhất (Best Answer) để xác định nó đã được trả lời để nhiều người có cùng thắc mắc sẽ có thể tìm được giải pháp tốt nhất.

Sở dĩ mình tạo ra trang này vì hiện nay tần suất mình trả lời qua email cũng rất lớn, và nhiều bạn đã lên thẳng group WordPress Việt Nam gọi thẳng tên mình để hỏi nhưng đó hoàn toàn không phải là khu vực cá nhân của mình. Như vậy với trang hỏi đáp này, bạn có thể yên tâm hơn vào hỏi vì sẽ được trả lời kỹ hơn do các câu trả lời trong đó đều mang tính chất công khai (mình cũng có nhu cầu đánh bóng tên tuổi của mình mà).

Hy vọng là với trang này, các vấn đề bạn đang gặp phải sẽ giải quyết tốt hơn và không gặp tình trạng lặp đi lặp lại câu hỏi nữa, về sau bạn có thể tìm kiếm vấn đề bạn đang gặp trên trang hỏi đáp mà không cần phải hỏi trực tiếp mình vì đợi rất là lâu. Ngay bây giờ, bạn có thể vào đăng ký tài khoản nhanh và đăng câu hỏi nhé.

Dịch ngôn ngữ trong WordPress trên website với Loco Translate

Vấn đề dịch thuật trong WordPress như dịch plugin và theme quả thực là một cơn ác mộng, đúng không chứ? Hầu hết các sản phẩm của WordPress bao gồm theme và plugin đều là tiếng Anh, mà nếu website bạn phục vụ cho đối tượng người Việt Nam hay một quốc gia nào đó thì dĩ nhiên phải cần dịch lại cho tương xứng, ít nhất là dịch các đoạn chữ hiển thị ra ngoài website.

Mặc dù ở blog mình đã có hướng dẫn sử dụng PoEdit để dịch thuật theme và plugin của WordPress nhưng nhiều người mới tham gia vẫn còn bỡ ngỡ, và đối với người làm chuyên nghiệp rồi thì hơi bất tiện vì phải tải gói ngôn ngữ về mà dịch.

Vậy có cách nào để có thể tạo gói ngôn ngữ nhanh cho một plugin hay theme và dịch trực tiếp trên website mà không cần tải về không? Dĩ nhiên có, trước đây mình có giới thiệu Codestyling Localization nhưng plugin đó lại dễ bị xung đột với một số plugin và theme, và chuối nhất là một số ngôn ngữ khi tạo ra lại có mã ngôn ngữ không đúng, ví dụ như ngôn ngữ tiếng Việt thì hiện nay WordPress sử dụng là vi.mo nhưng plugin đó lại sinh ra file tên là vi_VN.mo thành ra không làm việc được nếu bạn sử dụng WordPress tiếng Việt.

Nhưng thay vào đó, mình giới thiệu đến bạn một plugin khác có chức năng tương tự đó là hỗ trợ dịch file .po nhanh cho plugin/theme, hoặc tạo mới một file .po hoàn toàn tự động và bao gồm chức năng dịch và chuyển sang định dạng .mo, đó là plugin Loco Translate.

loco-translate-cover

Loco Translate là một plugin mới nhưng được đánh giá rất cao trong vấn đề hỗ trợ dịch thuật trên website WordPress. Với giao diện mang tính tương đồng với PoEdit, hỗ trợ dịch các form số nhiều y hệt như PoEdit và tự động đồng bộ các đoạn text trong theme/plugin là một ưu thế rất mạnh của Loco Translate.

Tại Loco Translate, bạn có thể dễ dàng tạo ra một gói ngôn ngữ nhanh nhất và nó sẽ tự động lưu trong thư mục ngôn ngữ thích hợp của plugin hoặc theme đó, hoặc bạn có thể sử dụng cấu trúc thư mục ngôn ngữ chung của WordPress ở /wp-content/languages/, mình khuyến khích bạn sử dụng tùy chọn global languages directory nếu dùng cho mục đích cá nhân để dễ quản lý gói ngôn ngữ.

Tạo một file PO nhanh cho plugin/theme trong Loco TranslateTạo một file PO nhanh cho plugin/theme trong Loco Translate

Ở phần chỉnh sửa, giao diện rất trực quan, hỗ trợ tải file PO hoặc MO về máy và dĩ nhiên là tự động chuyển đổi từ PO sang MO để cho WordPress đọc mỗi khi bạn ấn nút Save.

loco-translate-edit

Và nó có làm việc được không? Chắc chắn là có, xem này.

loco-translate-after

Chỉ đơn giản vậy thôi.

Để sử dụng Loco Translate tốt và có thể xem ngay những thay đổi sau khi dịch, bạn hãy tiến hành đổi ngôn ngữ của website WordPress tại Settings -> General -> Site Language. Nếu bạn muốn dịch thành tiếng Việt thì trước tiên phải cài ngôn ngữ tiếng Việt vào WordPress và tiến hành sử dụng Loco Translate sau.

wordpress-site-language

Sau đó bạn cài plugin Loco Translate vào và truy cập vào Loco Translate -> Manage translations để quản lý các gói ngôn ngữ của plugin và theme.

loco-translation-manage-translations

Bạn tìm đến sản phẩm mà bạn cần tạo ngôn ngữ hoặc cần dịch và ấn New Language (để tạo gói ngôn ngữ) hoặc click thẳng vào tên ngôn ngữ để bắt đầu dịch.

loco-translate-createnew

Và chọn ngôn ngữ trên danh sách ngôn ngữ, nó sẽ tự động điền mã ngôn ngữ cho bạn. Bạn có thể chọn kiểu lưu gói ngôn ngữ bất kỳ.

Tạo một file PO nhanh cho plugin/theme trong Loco TranslateTạo một file PO nhanh cho plugin/theme trong Loco Translate

Và cuối cùng là nó sẽ tự động nhập dữ liệu từ file template dạng .po có trong sản phẩm đó và bạn có thể bắt đầu dịch và ấn Save lại. Trường hợp nếu nó không xuất hiện chữ thì hãy ấn nút Sync để nó tự nhập text thủ công từ mã nguồn.

loco-translate-edit

Để tránh nhiều bạn thắc mắc khi gặp vấn đề thì mình xin nêu ra một số lưu ý khi sử dụng.

Theme/Plugin cần dịch phải có file template hiển thị là .po hoặc .pot. Nếu nó hiển thị kiểu “default.mo” thì bạn nên vào host, tìm file default.po và đổi tên thành [mã-ngôn-ngữ].po thủ công rồi dịch sau.Tránh sử dụng trên host yếu vì nó có thể làm đơ host của bạn.Hãy chắc chắn thư mục /wp-content/ và các thư mục bên trong nó đang được CHMOD 644 để có quyền ghi dữ liệu vào. Trường hợp khi dịch mà báo lỗi permission thì hãy liên hệ với nhà cung cấp host chứ không nên CHMOD thành 777 như giang hồ đồn đại.Nếu dịch xong mà ngôn ngữ không được kích hoạt thì hãy kiểm tra lại ngôn ngữ của website bạn có trùng khớp không, và thử tạo lại file ngôn ngữ với kiểu tùy chọn lưu file khác.Đây là plugin hỗ trợ bạn dịch thủ công plugin và theme chứ không phải plugin tự động dịch nội dung.Code trong plugin/ theme chắc chắn phải được viết theo chuẩn gettext, xem thêm.Xem FAQ của Loco Translate trước nếu gặp vấn đề.Tên mã ngôn ngữ phải trùng khớp với mã ngôn ngữ của website đang sử dụng. Để kiểm tra chắc chắn thì bạn cứ ấn Ctrl + U lên để xem mã nguồn và xem ở dòng .

Loco Translate mình đã sử dụng trong khoảng hơn 1 tuần qua trong việc phục vụ dịch một số từ quan trọng trong dịch vụ cài WordPress của mình và thấy nó hoạt động rất tốt nên mình cũng hy vọng rằng nó có sẽ có ích đối với bạn. Hãy nhớ một điều rằng đôi khi có một số theme bạn sẽ gặp tình trạng một số từ dịch nó sẽ ra, một số từ dịch nó sẽ không ra là vì có thể theme đó sử dụng nhiều textdomain khác nhau (kiểu như họ chắp vá nhiều code của nhiều tác giả vào) nên lúc đó bạn có thể sử dụng kèm thêm PoEdit để kiểm tra.

Chương trình offline Meetup WordPress Sài Gòn tháng 4/2015

Đam mê với web và lập trình, thích viết và chia sẻ, nghiện cà phê và xăm mình, hứng thú với nhạc dân ca và nhạc không lời.

Tự code chức năng phân trang bằng AJAX

Kỹ thuật AJAX (Asynchronous JavaScript and XML) bây giờ đã quá phổ biến trên website rồi, nó sẽ giúp việc truyền gửi dữ liệu từ backend ra frontend mà không cần tải lại trang. Hàng ngày bạn có thể sẽ thấy rất nhiều ví dụ về việc sử dụng AJAX, như việc bấm nút like hoặc gửi comment trên Facebook cũng đều là AJAX cả.

Trong bài viết này, mình sẽ hướng dẫn bạn cách làm quen với kỹ thuật AJAX áp dụng vào WordPress với một ví dụ phổ biến nhất là làm phân trang bằng AJAX. Từ ví dụ này, bạn có thể hiểu cách AJAX hoạt động trong WordPress để gửi dữ liệu về front-end.

Tải source

Trong ví dụ này, mình sẽ sử dụng theme TwentyFifteen để các bạn dễ làm theo. Nhưng bạn vẫn có thể làm ở các theme khác vì chỉ cần tìm ra cái vùng chọn của liên kết chuyển trang mà thôi, nếu bạn custom lại từ một theme khác thì nên tạo child theme.

ajax-pagination-twentyfifteen

Bây giờ bạn hãy vào thư mục /wp-content/plugins/ và tạo thêm một thư mục với tên là ajax-pagination. Trong thư mục ajax-pagination, bạn tạo ra một file tên là plugin.php với nội dung sau:

Từ bây giờ, mọi code bằng PHP bạn sẽ đều viết trong file plugin.php này. Sau đó bạn có thể vào Plugins -> Installed Plugins rồi kích hoạt plugin này lên.

Khi làm việc với AJAX chúng ta sẽ cần phải viết thêm một số đoạn Javascript nên sẽ cần tạo một file .js trong plugin rồi viết code cho nó tự nhúng vào theme. Bây giờ bạn hãy tạo một file tên ajax-pagination.js, sau đó viết thêm code này vào file plugin.php để chèn file này vào theme đang sử dụng tự động thông qua hàm wp_enqueue_script rồi móc vào hook wp_enqueue_scripts để nó thực thi.

/* @ ajax_pagination_scripts() @ Nhúng file ajax-pagination.js vào theme */ add_action( 'wp_enqueue_scripts', 'ajax_pagination_scripts' ); function ajax_pagination_scripts() { /* * Chèn file ajax-pagination.js vào frontend */ wp_enqueue_script( 'ajax-pagination-script', plugins_url( '/ajax-pagination.js', __FILE__ ), array( 'jquery' ) ); }

Về cách hoạt động của hook wp_enqueue_scripts và hàm wp_enqueue_script ra sao thì mình sẽ giải thích ở một bài khác. Nhưng trước hết bây giờ bạn có thể hiểu rằng với đoạn trên, nó sẽ tự động chèn một file ajax-pagination.js trong thư mục plugin hiện tại của nó nhờ hàm plugins_url(), cái array('jquery') có nghĩa là cho WordPress tự hiểu được script này sẽ sử dụng jQuery nhằm tự động chèn vào theme và luôn load sau jQuery để bị lỗi.

Nếu bạn cần chèn nhiều file Javascript khác nhau thì chỉ cần viết nhiều đoạn wp_enqueue_script() trong một hàm nào đó rồi móc vào hook wp_enqueue_scripts là được.

Bây giờ bạn hãy ra ngoài website kiểm tra qua mã nguồn HTML ngoài frontend của nó, file ajax-pagination.js đã được gọi ra thế này.

ajax-pagination-finish-addscript

Event cho AJAX nghĩa là một hành động nào đó mà chúng ta muốn dựa vào đó để kích hoạt việc gửi truy vấn, ở đây chúng ta sẽ sử dụng event click để gửi truy vấn khi click vào một vị trí nào đó. Và vị trí đó chúng ta sẽ xác định là các đường link bên trong thanh phân trang.

Bây giờ bạn hãy tìm đến thanh phân trang, ấn chuột phải vào đường link và chọn Inspect Element (hoặc Firebug) để xem vùng chọn khu vực đó, nó như thế này.

ajax-pagination-twentyfifteen-pagination

Bạn hãy để ý như trong hình, thanh phân trang sẽ được nằm trong một vùng chọn với class .nav-links. Sau đó các liên kết bên trong sẽ có class là .page-numbers. Riêng liên kết cho nút next thì sẽ có thêm class .next. Vậy nên để tạo ra event chính xác, chúng ta sẽ thiết lập một event click dựa trên thẻ a trong vùng chọn .nav-links (viết là .nav-links a).

Trước tiên hãy viết đoạn này vào file ajax-pagination.js để thiết lập event và thử nghiệm nó.

// chắc chắn là đang sử dụng chế độ No Conflict của jQuery, sử dụng jQuery() thay vì $()jQuery.noConflict();// load sau khi website được tải xongjQuery( document ).ready( function($) { $(document).on ( 'click', '.nav-links a', function( event ) { event.preventDefault(); // kiểm tra event click alert( "Bạn vừa click vào phân trang đấy!" ); } ) // end event} );

Và bây giờ hãy thử click vào phân trang đi xem có thấy cái bảng alert, nếu thấy thì thành công và xóa đoạn alert() trong code đi.

Thử nghiệm eventThử nghiệm event

Mặc định WordPress đã tích hợp sẵn các phương thức xử lý dữ liệu bằng AJAX, nên chúng ta có sử dụng thì chỉ cần gọi nó ra mà thôi. Để gọi nó ra, chúng ta sẽ tiến hành gọi file admin-ajax.php có trong WordPress ra với code sau (đặt bên trong hàm ajax_pagination_scripts mà ta đã khai báo ở trên):

/* * Gọi AJAX trong WordPress */ global $wp_query; wp_localize_script( 'ajax-pagination-script', 'ajax_object', array( // Các phương thức sẽ sử dụng'ajax_url' => admin_url( 'admin-ajax.php' ),'query_vars' => json_encode( $wp_query->query )));

Hàm wp_localize_script() sẽ có tác dụng dò tìm và sử dụng một script nào đó đã có trong mã nguồn WordPress vì file admin-ajax.php đã có sẵn rồi nên không dùng wp_enqueue_script() như ở trên nữa. Trong đó, ajax_object là đối tượng mà chút nữa chúng ta sẽ sử dụng trong file .js để xác định đối tượng AJAX. Còn global $wp_query; là ta sẽ đưa đối tượng $wp_query ra toàn cục để có thể sử dụng trong file của plugin nhằm lấy dữ liệu của post.

Sau khi chèn xong, bạn kiểm tra source thì sẽ thấy một đoạn script được in ra như sau:

Bây giờ việc còn lại mà bạn cần làm ở bước này đó là viết Javascript để khai báo AJAX.

// chắc chắn là đang sử dụng chế độ No Conflict của jQuery, sử dụng jQuery() thay vì $()jQuery.noConflict();// load sau khi website được tải xongjQuery( document ).ready( function($) {$(document).on ( 'click', '.nav-links a', function( event ) {event.preventDefault();// AJAX$.ajax({url: ajax_object.ajax_url,type: 'post',data: { action: 'ajax_pagination_data' },success: function( ketqua ) {// Thử nghiệmvar ketqua = "AJAX working";alert( ketqua );}})} ) // end event} );

Từ đoạn 10 đến đoạn 23 là những code mà chúng ta cần viết bổ sung vào file ajax-pagination.js, mình giải thích như sau:

$.ajax() – Đây là một hàm đặc biệt trong jQuery để xử lý AJAX đơn giản và gọn gàng hơn. url: Đường dẫn của file mà các dữ liệu sẽ được gửi vào khi thực thi AJAX từ event click. ajax_object.ajax_url có nghĩa là đường dẫn của file admin-ajax.php mà ta đã khai báo ở file plugin.php.type: loại phương thức gửi dữ liệu, sử dụng POST hay GET gì tùy bạn nhưng nếu chỉ là nhận dữ liệu thôi thì mình khuyến khích bạn dùng POST.data: khai báo đối tượng chứa dữ liệu trả về sau khi gửi request từ AJAX. ajax_pagination_data nghĩa là cái hàm trả dữ liệu về, chút nữa chúng ta sẽ viết nó sau.success: hành động sau khi AJAX truyền dữ liệu thành công, tạm ở ở đây sẽ kiểm tra bằng cách in một đoạn chữ ra để thử nghiệm. Nếu nó trả về được thì thành công.

Bây giờ lưu lại và hãy thử click vào cái link phân trang xem biến ketqua có trả về không, nếu có thì thành công.

ajax-pagination-test-ajax

Như mình nói ở trên, tham số data là sẽ chứa đối tượng trả kết quả về, nên bây giờ chúng ta sẽ xây dựng đối tượng ajax_pagination_data để trả về cho user khi họ truyền dữ liệu về. Trước tiên, bạn sẽ cần sửa lại file ajax-pagination.js thành như sau:

// chắc chắn là đang sử dụng chế độ No Conflict của jQuery, sử dụng jQuery() thay vì $()jQuery.noConflict();// load sau khi website được tải xongjQuery( document ).ready( function($) {/* @ hàm xác định số trang sẽ được tải @ bằng cách bóc tách số trong chuỗi dữ liệu */function set_page( element ) {element.find('span').remove();return parseInt( element.html() );}$(document).on ( 'click', '.nav-links a', function( event ) {event.preventDefault();page = set_page( $(this).clone() );// AJAX$.ajax({url: ajax_object.ajax_url,type: 'post',data: {action: 'ajax_pagination_data',query_vars: ajax_object.query_vars,page: page},beforeSend: function() {/* @ Tạo các hiệu ứng trước khi request gửi đi */$( '#main' ).find( 'article' ).remove();$( '#main nav' ).remove();$( '#main' ).scrollTop(0);$( '#main' ).append( '
Đang lấy dữ liệu bài viết
' );},success: function( ketqua ) {/* @ Xóa nút loading @ và khôi phục lại dữ liệu trả về */$( '#main' ).find( '#loading' ).remove();$( '#main' ).append( ketqua );console.log(page);}})} ) // end event} );

Ở đoạn code mới, chúng ta có thêm một hàm mới mang tên set_page() trong Javascript. Hàm này sẽ có tác dụng tìm kiếm tất cả nội dung trong thẻ span của tài liệu. Sau đó tiến hành dùng hàm parseInt() trong Javascript để tách số trong chuỗi dữ liệu tìm thấy. Mục đích của nó là để chúng ta lấy được con số của trang trong các đoạn text trên website, ví dụ trên thanh pagination sẽ có các số 1,2,3,4,…nó sẽ lấy các số này để làm giá trị của tham số page nhằm giúp query của WordPress hiểu được sẽ cần lấy dữ liệu của trang nào.

Chúng ta sẽ khai báo thêm tham số query_vars và page vốn sẽ được dùng trong việc gửi truy vấn trong WordPress để lấy danh sách post. Tham số query_vars được xem là một phương thức của đối tượng ajax_object mà chúng ta đã khai báo ở file plugin.php. Còn tham số page là nó sẽ sử dụng giá trị trả về của hàm set_page() ta tạo ở trên.

Kế tiếp là tham số beforeSend để thêm cái gì đó trước khi dữ liệu của truy vấn gửi đi. Chúng ta sẽ dùng để xóa các post (thẻ aritlce trong #main của TwentyFifteen), xóa thẻ khung pagination đang có (thẻ nav có class pagination trong #main của TwentyFifteen) và cuối cùng là thêm vào dữ liệu nhận được vào trong #main. Và quan trọng là tự động nhảy lên đầu website với phương thức scrollTop và in một đoạn nội dung cho người dùng biết là dữ liệu đang được tải.

Cuối cùng là tham số success sẽ trả kết quả về sau khi gửi truy vấn AJAX đến WordPress vì tham số ketqua WordPress tự hiểu được đó là hàm hứng dữ liệu trả về. Đồng thời xóa cái chữ Đang lấy dữ liệu bài viết kia đi.

Mình cũng xin lưu ý như sau:

#main - vùng chọn của khung hiển thị danh sách các post.article - vùng chọn riêng lẻ của post, bạn có thể dùng class .post cũng được.nav.pagination – vùng chọn cho khung phân trang.

Và tiếp theo là tạo hàm để trả dữ liệu về cho AJAX với hook là tên action wp_ajax_ajax_pagination_data, trong đó ajax_pagination là tên action mà ta đã khai báo ở ajax-pagination.js, còn wp_ajax là tiền tố bắt buộc cho hook khi làm việc với AJAX trong WordPress.

/* @ Hàm chứa dữ liệu trả về */add_action( 'wp_ajax_nopriv_ajax_pagination_data', 'set_ajax_pagination_data' );add_action( 'wp_ajax_ajax_pagination_data', 'set_ajax_pagination_data' );function set_ajax_pagination_data() { $query_vars = json_decode( stripslashes( $_POST['query_vars'] ), true ); $query_vars['paged'] = $_POST['page']; $posts = new WP_Query( $query_vars ); $GLOBALS['wp_query'] = $posts; if( ! $posts->have_posts() ) { get_template_part( 'content', 'none' ); } else { while ( $posts->have_posts() ) { $posts->the_post(); get_template_part( 'content', get_post_format() ); } } the_posts_pagination( array( 'mid_size' => 5, 'prev_text' => __( 'Previous page', 'twentyfifteen' ), 'next_text' => __( 'Next page', 'twentyfifteen' ), 'before_page_number' => '' . __( 'Page', 'twentyfifteen' ) . ' ', ) ); die();}

Ở đoạn trên, đầu tiên là chúng ta chuyển dữ liệu ở biến $_POST['query_vars'] được trả về bởi AJAX vì mặc định hàm $.ajax() của jQuery sẽ trả dữ liệu về là kiểu JSON và lưu vào biến $query_vars.

Kế tiếp, chúng ta đưa giá trị của $_POST['page'] khi được AJAX gửi về vào biến $query_vars['paged'] để thiết lập phân trang cho query.

Cuối cùng là ta tạo một đối tượng $posts từ biến $query_vars ở trên và gọi template content.php ra để hiển thị nội dung. Trong theme TwentyFifteen thì file này sẽ chứa các đoạn code hiển thị từng thành phần của một post và vòng lặp cứ thế lặp đi lặp lại. Đồng thời chèn thêm một thanh phân trang mới với hàm the_posts_pagination() và kết thúc quá trình cho đến khi nó đã hoàn tất việc lặp.

Bây giờ bạn có thể lưu lại và ra ngoài thử click vào liên kết chuyển trang ở các con số trong phần phân trang để xem nó có hoạt động hay không, nếu bạn làm từ đầu bài tới giờ thì nó sẽ hoạt động được.

Cũng nên lưu ý là kể từ WordPress 4.1 trở đi thì hàm the_posts_pagination() sẽ hiển thị thanh phân trang dạng số rồi.

Thực ra tutorial này mình đang gặp phải một vấn đề là nếu bạn nhấp vào liên kết dạng số trên phân trang thì nó sẽ làm việc được, nhưng nếu bạn click vào nút Next hay đại loại như vậy thì nó sẽ trả về trang chủ. Bởi vì theo tutorial này thì dữ liệu từng trang của WordPress sẽ được lấy nhờ vào biến $query_vars['paged'] mà nó hứng được từ dữ liệu mà jQuery gửi về bằng AJAX, trong khi đó ở file Javascript mình đã xác định rằng số trang sẽ được tìm bằng cách dùng hàm parseInt() trong Javascript để tách số trên thẻ , vốn là liên kết của từng trang trong phân trang. Nhưng nếu thẻ đó có nội dung là chữ Next thì dĩ nhiên nó sẽ trả về giá trị là “NaH”, tương ứng với việc không có dữ liệu kiểu số nào, thành ra sẽ không hoạt động được.

Còn cách làm phân trang kiểu Next, Prev thì hiện nay có rất nhiều tutorial nên bạn có thể tìm trên Google.

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

19 themes WordPress miễn phí đẹp nhất tháng 3/2015

Trong tháng vừa qua mình không giới thiệu serie các theme đẹp nhất do về Việt Nam ăn Tết, thành qua tháng này mình sẽ giới thiệu bù nên số lượng các theme đẹp sẽ nhiều hơn so với các tháng khác. Trước khi bước qua tháng 4, chúng ta cùng nhau điểm danh lại một số theme WordPress miễn phí tuyệt đẹp mà trong tháng vừa qua đã được ra mắt, có thể từ đó bạn sẽ tìm ra được một theme mà các bạn cần.

optimizer-theme

Mình biết đến Optimizer do nhà sản xuất đã gửi email mình nhờ mình xem qua và viết bài giới thiệu. Thực chất là ngay sau khi xem qua theme này thì mình đã định viết một bài riêng để giới thiệu các tính năng tuyệt vời của nó, tuy nhiên trước tiên mình cần phải giới thiệu về nó ở đây cái đã.

Optimizer là một theme có độ tùy biến cao và bạn có thể xây dựng một giao diện theo ý thích từ khung mẫu có sẵn của Optimizer. Nếu bạn click vào chữ Demo ở trên và xem thì có thể thấy họ có đưa ra khá nhiều mẫu demo để bạn xem nhưng đều làm trên một theme duy nhất, và bạn có thể làm được nhiều hơn thế.

Theme này được tích hợp sẵn hơn 600+ font chữ từ Google Font, nhiều widget đẹp mắt và độc đáo như Social, Countdown, Ads,…và được tối ưu SEO/tốc độ khá tốt.

lotus-free-theme

Thêm một theme miễn phí dành cho website tin tức, tạp chí lại ra đời mang tên Lotus. Với theme này bạn có thể làm một trang tin tức cho riêng mình hoàn toàn miễn phí, và bạn cũng có thể tích hợp thêm Woocommerce để bổ sung tính năng bán hàng vì nó cũng đã được tối ưu cho việc hiển thị sản phẩm của Woocommerce.

Điểm độc đáo của theme này là bạn có thể tạo ra sidebar riêng và có thể tùy ý sử dụng từng sidebar cho từng trang khác nhau trên website.

rowling-free-theme

Anders Noren là một nhà thiết kế của Thụy Điển đã khá nổi tiếng với việc thường xuyên chia sẻ một số theme dành cho chủ đề blog do chính tay anh ấy thiết kế, tất cả theme của Anders Noren đều mang một nét đẹp đơn giản nhưng rất tinh tế, từ việc phối màu và sử dụng loại font chữ. Rowling là một sản phẩm miễn phí mới nhất của Anders Noren và dĩ nhiên là nó rất đẹp.

Với cách hiển thị và bố cục làm ta liên tưởng đến theme Hueman đình đám nhưng Rowling lại có phần đơn giản hơn, gọn nhẹ hơn dành cho những bạn cần một theme dành cho blog đẹp mà lại dễ dàng cài đặt.

adironnack-theme

Có thể bạn sẽ cần một theme với kiểu thiết kế khác lạ làm giao diện cho blog của mình, mà nếu blog bạn có nhiều hình ảnh và đặt những tấm ảnh tuyệt đẹp làm Featured Image thì theme này bạn nên sử dụng thử vì nó có thể làm tăng thêm vẻ đẹp cho website nhờ chính những hình ảnh đại diện đó.

Một điều bạn nên lưu ý là theme Adirondack này có một bài hướng dẫn ngắn khá chi tiết về cách thiết lập, bạn có thể xem tại đây.

amplify-theme

Amplify thích hợp cho các nhu cầu tạo một trang resume cá nhân và trưng bày các tác phẩm trong portfolio của mình vì nó được thiết kế để làm việc đó. Ngay tại trang chủ, bạn có thể đặt các nút Call to Action khá đẹp mắt, các khung tự giới thiệu,…

biancaa

BiancaA là một theme dành cho blog hiếm hoi của Theme Junkie - một nhà cung cấp theme WordPress trả phí mà Thạch rất thích vì các theme đầy chất lượng (giao diện Thachpham.com là của Theme Junkies đấy chứ). Theme này mang hơi hướm của phong cách Minimalist (phong cách tối giản) với hai màu chủ đạo là đen trắng, không mang nhiều chi tiết phức tạp nhưng nó vẫn có nét đẹp riêng của nó nhờ vào bố cục hài hòa.

Trong mỗi bài viết riêng, bạn có thể tùy chỉnh hiển thị sidebar bên trái hoặc phải tùy thích hoặc thậm chí là không có sidebar nào để phù hợp với nhu cầu của bạn.

tiles-free-theme

Tại sao lại không trưng bày các hình ảnh lên blog của mình với một phong cách cuốn hút hơn thay vì sử dụng một giao diện WordPress không phù hợp? Nếu bạn thích đăng ảnh lên blog của mình thì hãy thử cài qua theme Tiles này vì nó được thích hợp cho các blog về ảnh do hội tụ đủ các yếu tố như hiển thị hình ảnh đẹp, khung nội dung rộng rãi để hiển thị các tấm ảnh có kích thước lớn.

boardwalk-theme

Đây là một theme đang được sử dụng tại dịch vụ WordPress.Com nhưng nếu bạn là người dùng WordPress tự host thì đã có thể sử dụng hoàn toàn miễn phí. Boardwalk là một theme rất độc đáo khi việc hiển thị các bài viết mới ở trang chủ theo dạng slide trượt ngang rất đẹp, và trang hiển thị nội dung bên trong cũng có phần lộng lẫy không kém.

Nếu bạn thích theme này mà không thích việc hiển thị kiểu slide thì có thể sử dụng child theme Cubic của nó.

photolab-theme

Tuy là một theme đơn giản dành cho blog nhưng cách bày trí bài viết của theme này có nét rất khác lạ và tận dụng chiều rộng tối đa của trình duyệt để làm nổi bật hình ảnh bên trong bài viết. Theme này có hỗ trợ một số loại Post Format mà bạn có thể sử dụng để nó hiển thị bài viết theo kiểu khác nhau.

sksdev-theme

SKSDEV là một theme dạng One Page (chỉ một trang duy nhất) miễn phí khá đẹp trong thời điểm hiện tại, bạn có thể sử dụng nó để làm các trang giới thiệu doanh nghiệp hoặc một dịch vụ nào đó.

codiumnow-theme

CodiumNow khá đơn giản nhưng thích hợp cho nhu cầu làm blog hoặc tự phát triển lại thành một theme đẹp hơn, tính năng của nó cũng không có gì ngoài việc hiển thị bài viết thành 3 cột ở trang chủ, nhưng chính vì vậy mà theme này rất nhẹ.

jovial-theme

Theme này trông rất đơn giản và gọn gàng, nhưng được tích hợp sẵn menu có hỗ trợ dropdown khá đẹp mắt thì tại sao lại không sử dụng nó để phát triển thành một theme khác của riêng mình từ bố cục này nhỉ? Có thể gọi đây là một Starter Theme khá là tốt.

keratin-theme

Keratin nổi bật vì chính sự đơn giản của nó, không gian thoáng đãng cùng với những khoảng cách hợp lý giúp nó trở thành một theme rất đẹp mặc dù chỉ có hai màu trắng và đen. Nhưng có vẻ cách thiết kế này phù hợp với dân designer hơn là người dùng phổ thông.

wikiwp-theme

Tại sao lại không trình bày nội dung bài viết của mình giống như một trang Wiki chứ? Mặc dù theme này không phải là một theme tạo hệ thống Wiki chuyên nghiệp nhưng cách hiển thị nó có thể làm bạn thỏa mãn mong muốn biến blog mình thành một trang Wiki nghiệp dư.

aventurine-theme

Aventurine là một theme đơn giản mà rất đẹp cho các nhu cầu viết blog, viết sách hoặc có thể đăng bất cứ gì mà bạn cho là thích hợp với một giao diện nhiều chữ. Nó được tích hợp sẵn các tùy chọn khá thuận tiện tại Customize để bạn có thể thay đổi từng tùy chỉnh trong theme nhanh chóng.

mayer-theme

Sau khi xem qua demo, bạn có nghĩ rằng theme Mayer này có giá $79 cho những người sử dụng dịch vụ WordPress.com? Đúng vậy, đây là một theme trả phí cho người dùng WordPress.Com nhưng nếu bạn sử dụng WordPress tự host thì bạn có thể cài đặt theme này hoàn toàn miễn phí vì nó đã trở thành nguồn mở.

harmonic

Nếu bạn thích sử dụng một theme nổi trội, thích sử dụng hình ảnh làm ảnh nền thì hãy thử một theme nặng hàng tấn như Harmonic, nó nặng vì trang demo của nó có dung lượng là 7MB vì quá nhiều ảnh.

Tuy nặng là vậy nhưng Harmonic rất đáng để sử dụng, nhất là các trang về blog. Ngoài ra, nó cũng hỗ trợ một khu vực Media để hiển thị hình ảnh theo album rất đẹp.

sprig-theme

Nếu bạn là một lập trình viên cần tìm một Starter Theme mới nổi trội hơn, dễ phát triển hơn thì đừng nên bỏ qua Sprig, đặc biệt nếu bạn là fan của Twig. Bằng việc ứng dụng Twig vào template của theme, nó sẽ giúp bạn phát triển thành một theme mới nhanh hơn so với việc gõ code thủ công. Ví dụ dưới đây là một đoạn loop trong Sprig:

{% for post in posts() %} {% include 'content/content-excerpt.twig' %}{% endfor %}

It’s fast?

auberge-themeAuberge là một theme miễn phí rất đẹp dành cho website nhà hàng, quán cafe vì nó có hỗ trợ bạn đăng thực đơn các món ăn lên và được sắp xếp rất đẹp mắt, gọn gàng. Thêm vào đó, nó cũng được tích hợp thêm chức năng đặt hàng đơn giản nếu bạn có ý định cho phép khách đặt món ăn trên website WordPress của bạn.

Đó là 19 themes WordPress miễn phí đẹp nhất mà đã được ra mắt hoặc mình biết đến trong tháng 3/2015. Các theme trong tháng này mình nhận xét đều rất đẹp và đa dạng, đặc biệt là có sự góp mặt của một starter theme mới mình rất thích là Sprig. Hy vọng danh sách theme miễn phí tháng sau sẽ nhiều và đẹp hơn thế nữa.

vHost giảm giá VPS SSD nhân dịp Cá tháng tư 2015

Nhân dịp Cá tháng tư (Aprill Fool – 01/04), nhà cung cấp giải pháp máy chủ vHost có mục giảm giá sốc cho dịch vụ VPS sử dụng ổ cứng SSD của họ chỉ với 70.000 VNĐ/tháng và áp dụng cho máy chủ đặt tại Việt Nam và Singapore.

vhost-april-fool-banner

Cụ thể, các bạn sẽ được mua VPS ổ cứng SSD với cấu hình như sau:

CPU: 2 CoresRam: 1GBSSD: 10GBBăng thông: không giới hạn

Để lấy mã giảm giá, mời các bạn click vào nút bên dưới, sẽ có hai mã giảm giá đặc biệt dành cho việc mua 1 năm và 2 năm.

Cũng xin nói thêm rằng vHost là nhà cung cấp dịch vụ máy chủ khá chất lượng tại Việt Nam, và mình cũng đã sử dụng VPS tại vHost trong việc làm serie Học VPS căn bản của mình, nên mình tin rằng bạn sẽ cảm nhận được chất lượng dịch vụ tuyệt vời tại đây.

Chủ Nhật, 1 tháng 2, 2015

Hướng Dẫn Rút Tiền Từ Payoneer Về Ngân Hàng Việt Nam

Trong một bài viết khá lâu mình có giới thiệu về Payoneer Prepaid Master Card – một trong những công cụ giúp các bạn làm tiếp thị liên kết Việt Nam rút ngắn thời gian nhận tiền từ các mạng tiếp thị liên kết như Amazon, Shareasale, Clickbank, Avangate…hay kể cả các trang thanh toán như PayPal và MoneyBookers, các bạn đã hiểu qua về cách đăng ký và công dụng của công cụ này rồi. Tuy nhiên, tại thời điểm đó, bạn chỉ có thể rút tiền tại các điểm ATM có biếu tượng Visa/Master Card với hạn mức chỉ có 2.000.000 VNĐ/lần như dùng thẻ ATM nội địa và phí cũng tương đối cao.

Tuy nhiên, gần đây Payoneer đã có thêm tính năng mới – đó là cho phép chúng ta rút tiền từ Payoneer về ngân hàng Việt Nam mà không cần phải mất công ra ATM rút nhiều lần. Đây là điều mà chúng ta đã chờ đợi và cuối cùng cũng có câu trả lời từ Payoneer. Hơn thế nữa, Payoneer cũng nhìn nhận thị trường Việt Nam là rất tiềm năng thông qua việc tuyển dụng một người Việt Nam phụ trách thị trường Việt Nam nhưng làm vìệc tại Văn Phòng Israel. Cô ấy đã liên hệ với mình để xem có gì cần hộ trợ và điều này chứng tỏ thị trường Việt Nam đang rất tiềm năng trong chiến lược của Payoneer.

Bạn chỉ cần đăng ký tài khoản Payoneer và kích hoạt nó là có thể sử dụng các tính năng của thẻ này. Sau đó bạn sẽ có thêm 1 tài khoản tại Ngân Hàng Mỹ với dịch vụ US Payment Service giúp bạn nhận tiền và chuyển tiền thuận tiện.

Hôm nay mình xin hướng dẫn cách rút tiền từ Payoneer trực tiếp về ngân hàng Việt Nam để các bạn tiện tham khảo. Hạn mức rút tiền mỗi lần tối thiểu là $500 và tối đa $9.500. Đây là mức rút tiền lý tưởng cho các bạn có thu nhập từ trung bình đến cao từ các mạng tiếp thị liên kết.

Bước 1: Đăng nhập tài khoản Payoneer của bạn

Nếu bạn chưa có account của Payoneer và US Payment Service thì hãy đăng ký cho mình một tài khoản nhé.

p1

Bước 2: Lựa chọn tính năng rút tiền về ngân hàng.

Chọn Withdrawal rồi chọn My bank Account như hình dưới:

p2

Bước 3: Khai báo thông tin tài khoản ngân hàng

Lựa chọn Add bank Account như hình:

p3

Tiếp đó, Payoneer sẽ bắt bạn xác thực thẻ để đảm bảo an toàn cho bạn. Nhập số thẻ, CVV, ngày/tháng/năm sinh và mật khẩu đăng nhập Payoneer như hình:

p4

Bây giờ bạn sẽ phải khai báo thông tin chi tiết tài khoản ngân hàng của mình. Các thông tin sẽ bao gồm:

Quốc gia,Lọai tiền tệ,Chi nhánh,Tên chủ tài khoản,Số tài khoản,Số swift/BIC codeGhi chú (tùy chọn) như demo bên dưới:

p5

Bước 4: Chờ thông tin phê duyệt từ Payoneer

Sau khi khai báo và nhấn nút Finish thì Payoneer sẽ gửi thông tin xác thực về email là đã nhận được yêu cầu của bạn. Thông thường sau 1-3 ngày làm việc họ sẽ gửi thông tin phê duyệt cho bạn như sau:

confirm bank

Lưu ý: Đối với nhiều bạn Việt Nam, Payoneer có thể sẽ yêu cầu bạn xác thực bằng cách cầm chứng minh thư nhân dân sát mặt và chụp ảnh cả mặt và chứng minh thư để gửi cho họ xác thực. Đây là hình thức để bảo vệ bạn. Tuy có hơi khó chịu nhưng nó là cần thiết. Mình không bị nên không hướng dẫn chi tiết bước này và nó cũng chỉ xảy ra khi bạn nhận nhiều lần và nhiều tiền trong tháng.

Về Swift code hay BIC code thì các bạn có thể hỏi ngân hàng của mình để biết chi tiết. Đối với Vietcombank thì bạn có thể lấy Swift code tại trang này: http://www.vietcombank.com.vn/personal/MoneyTransfer/ Mục nhận tiền từ nước ngoài hoặc như dưới:

BANK FOR FOREIGN TRADE OF VIETNAM
Address: 198 Tran Quang Khai, Hanoi, Vietnam
Swift code: BFTVVNVX

Bước 5: Đặt lệnh rút tiền

Sau khi được phê duyệt thì các bạn đăng nhập và đặt lệnh rút tiền. Chọn Withdrawal -> My Bank Account và làm như hình.

p6

Hạn mức tối thiểu mỗi lần rút: $500Hạn mức tối đa mỗi lần rút: $9.500Hạn mức tối đa rút/tháng: $75.000Thời gian về ngân hàng Việt Nam: 1-3 ngày làm việcPhí rút tiền về ngân hàng Việt Nam:  2%~2.2%, về bank VN thu thêm 0.05%

Hy vọng bài chia sẻ ngắn sẽ giúp anh em đang làm tiếp thị liên kết thêm vững tin và xóa tan nỗi lo trong khâu thanh toán hoa hồng của các mạng nhé. Hiện Payoneer hỗ trợ cho nhiều mạng điển hình như sau:

Airbnb
Airpush Inc.
Alamy Inc.
Amazon.com Inc. (and its subsidiaries, including CreateSpace, a DBA of On-Demand Publishing, LLC.)
AOL
Apollo Group, Inc.
Apple Inc.
Barnes & Noble
Bright Market LLC
Digital River Inc. (and its subsidiaries, including SWReg)
eBay Inc.
E-Trade Financial Corporation
Etsy, Inc.
Facebook Inc.
Getty Images Inc.
Google Inc.(and its subsidiaries, including AdMob)
Half.com Inc.
Helium
Intel Corporation
Keynetics Inc. (Click Bank)
Lifestreet
LinkedIn Corporation
LinkShare Corporation
LSI Corporation
Microsoft Corporation
Nokia Corporation
Overstock.com
PayPal Inc. (Important Note: Transfers from PayPal to Payoneer are allowed, but transfers from the US Payment Service to PayPal are automatically declined)
Pepperjam Inc.
Quotient Integrated Solutions
Research in Motion Limited
ShareASale.com Inc.
Skrill USA – MoneyBookers
The Pep Boys
ValueClick Inc. (Commission Junction)
Workforce Language Services LLC
Yahoo! Inc.
Zecco Holdings, Inc.

ĐĂNG KÝ PAYONEER NGAY

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

eBlogViet là blog cá nhân chuyên về tiếp thị liên kết, internet marketing và kiếm tiền trên mạng cho cộng đồng blogger Việt Nam. Đăng ký nhận tin RSS để không bỏ lỡ các tin cập nhật.

Kiếm Tiền Trên Mạng Với TeeSpring Tại Sao Lại HOT?

teespringNhiều bạn cứ hỏi mình trên facebook và qua email về thực hư chuyện bán áo thun trên Teespring hay nhiều trang khác là như thế nào. Xin trả lời các bạn đó là sự thất và trong bài viết về kiếm tiền trên mạng có phải là lừa đảo mình đã chia sẻ một chút về mô hình này.

Trước khi đi vào chi tiết mình cũng xin nói trước là mình không phải là người thành công lắm với mô hình bán áo thun này mà chỉ tham gia khi thấy nó có tiềm năng và kết quả cũng không phải là tồi. Xin chia sẻ lại để các bạn tham khảo thêm nhé.

Tài khoản 1 Tài khoản 1

Tài khoản 2 Tài khoản 2

Trước hết chúng ta cùng tìm hiểu về TeeSpring một chút. Đây là một trang dạng crowdfunded hiểu nôm na là huy động vốn từ cộng đồng để tạo ra các sản phẩm trên những chiếc áo thun/áo phông. Bạn tham gia miễn phí và có thể thiết kế tùy thích theo khả năng của mình với một công cụ thiết kế online thuộc dạng mạnh nhất so với các dịch vụ cùng loại hiện nay.

Bên cạnh đó, bạn được phép tự đặt mức giá, thời gian chạy chiến dịch và biết được mức lãi trên mỗi áo bán bạn ra là bao nhiêu nếu bạn đủ chi tiêu (tối thiểu là 10 cái). Tất nhiên nếu bạn bán vượt chi tiêu sẽ có bonus từ Teespring. Chính những tính năng này giúp bạn có được cảm giác tự do hơn khi thiết kế và bán áo thành công hơn.

Gần đây Teespring đưa thêm nhiều tính năng giúp người tham gia cơ hội bán nhiều hơn khiến mình cảm thấy đây là trang có sự phát triển mạnh nhất so với các trang cùng loại khác.

Đúng là thiết kế là chuyện không khó với nhiều bạn nhưng bán được hay không lại là chuyện khác. Tuy nhiên, sự kết hợp giữa Teespring + Facebook Ads đã tạo nên nhiều triệu phú đô la từ việc bán áo thun trên thế giới. Ở Việt Nam nhiều bạn cũng kiếm vài trăm ngàn USD chỉ từ việc bán áo này không phải là hiếm. Tiềm năng là không giới hạn!

Facebook là công cụ tốt nhất tại thời điểm này để quảng bá cho các mẫu áo thiết kế thông qua Facebook Ads hoặc Fanpage. Vấn đề là bạn cần ngân sách, biết sử dụng Facebook Ads và cách target đúng khách hàng tiềm năng.

Ví dụ: Bạn thiết kế một chiếc áo dành cho những phụ nữ yêu thích chó chẳng hạn thì bạn sẽ phải nhắm tới những ai yêu thích chó mà là nữ trên facebook thì quảng cáo chỉ hiện cho những người đó thôi.

Tất nhiên, kinh nghiệm sau khi chạy một vài chiến dịch sẽ giúp bạn tối ưu chi phí hơn cho các quảng cáo của mình.

Hiện tại, cho các chiến dịch của Teespring ngắn từ 3-23 ngày nên việc sử dụng SEO là điều không khả thi tron khi facebook bạn còn có thể tương tác với khách hàng tiềm năng khi họ băn khoăn về giá, vận chuyển hay độ uy tín…Kinh nghiệm cho thấy, việc trả lời các comment trên các chiến dịch facebook đóng góp rất lớn vào việc tăng doanh thu.

Trong khóa học tiếp thị liên kết V3 mình đã thêm 1 module chuyên về Teespring và sẽ mở rộng ra các mạng khác khi có thông tin và dường như các bạn có vẻ thích. Đơn giản đây là cách đâu tư thấy ngay lợi nhuận vì bạn có thể thấy lại trong 3 ngày hoặc 7 ngày. Teespring trả ngay lợi nhuận cho bạn khi chiến dịch thành công qua PayPal hay Payoneer đều được.

Với tâm lý kiếm tiền nhanh của nhiều bạn thì mô hình này có vẻ như là tương đối phù hợp giúp bạn lấy lại vốn ngay trong tuần.

Mốt lý do nữa bạn cần đăng ký ngay hôm nay qua link của mình là bạn sẽ nhận được thêm $1 cho mỗi áo bán ra và mình cũng thế. Đây là dạng win-win. Nghĩa là bạn đăng ký thẳng trên Teespring và mỗi áo bạn lãi $10 thì nếu bạn đăng ký tài khoản qua link dưới thì bạn sẽ lãi $11/áo. Quá tốt đúng không?

eBlogViet là blog cá nhân chuyên về tiếp thị liên kết, internet marketing và kiếm tiền trên mạng cho cộng đồng blogger Việt Nam. Đăng ký nhận tin RSS để không bỏ lỡ các tin cập nhật.

Varnish Cache là gì?

Varnish là một ứng dụng mã nguồn mở (Open source) có tác dụng lưu lại bộ nhớ đệm của website bằng phương thức làm proxy trung gian giữa nội dung website gốc và trình duyệt, và Varnish sẽ tạo một bản cache ngoài frontend. Hãy hiểu đơn giản hơn là, mặc định các webserver sẽ sử dụng cổng 80 để gửi dữ liệu tới trình duyệt để người dùng đọc nó, nhưng khi sử dụng Varnish thì chúng ta sẽ muốn cho người dùng nhận các dữ liệu trong cache nên sẽ sử dụng Varnish làm cổng 80, còn dữ liệu website gốc sẽ được trả về một cổng nào đó mà Varnish sẽ nhận dữ liệu trực tiếp từ đó rồi lưu lại và gửi cho người dùng. Nhìn chung Varnish sẽ làm việc tương tự như việc sử dụng NGINX làm proxy cho Apache vậy nhưng Varnish là một ứng dụng cache nên sẽ làm việc đó tốt hơn và có tốc độ truy xuất tốt hơn.

varnish-logoLogo chính thức của Varnish

Varnish là một ứng dụng độc lập nên việc sử dụng Varnish để lưu và truy xuất cache trên website sẽ có những lợi thế như bạn có thể thoải mái tùy chỉnh để nó ghi và truy xuất như mong muốn, mặc dù sẽ hơi nâng cao và khó một chút nhưng nếu bạn hiểu các quy tắt trong VCL (Varnish Configuration Language) thì sẽ rất linh hoạt trong sử dụng, có thể cấu hình cache cho bất cứ loại website nào. Việc Varnish trực tiếp làm proxy để gửi dữ liệu cache cũng sẽ có tốc độ tốt hơn so với hình thức lưu cache thông thường.

Hơn nữa theo mình đánh giá, quy trình ghi và lưu cache trong Varnish hao tốn rất ít tài nguyên, thậm chí là tốn ít hơn quy trình một website thông thường ghi cache ra một file HTML tĩnh (HTML Cache) nên Varnish đang là lựa chọn đáng quan tâm cho các website lớn và có nhiều trang trên website.

Như mình đã nói là Varnish ban đầu sẽ hơi khó cấu hình cho những người dùng phổ thông nên nếu bạn có các website chứa nhiều dữ liệu như blog có nhiều bài viết, tạp chí, tin tức,…với lượng truy cập cao thì sẽ là cơ hội rất tốt để sử dụng Varnish.

Hiện nay những website đang sử dụng Varnish mà bạn có thể kiểm chứng như The New York Times, Facebook, Twitter, Wikipedia,….và hầu hết hiện nay các website lớn với nhiều nội dung như vậy đang sử dụng Varnish để tối ưu hơn về tốc độ website cũng như tiết kiệm tài nguyên.

Dĩ nhiên Varnish phải có một số lợi thế thì các website lớn kia mới đang sử dụng như vậy. Theo sự hiểu biết và kinh nghiệm của mình, Varnish sẽ có các lợi thế như:

Ghi dữ liệu đệm của nội dung truy xuất ra webserver mà không cần thêm bất cứ đoạn code nào vào mã nguồn website.Dĩ nhiên, bạn có thể sử dụng với bất kỳ website nào, ngôn ngữ nào, miễn là nó sử dụng webserver thì đều có thể sử dụng Varnish được.Varnish hoạt động như một kỹ thuật đa luồng (heavily threaded) nên các kết nối vào website không cần phải chờ đợi webserver xử lý, giúp tiết kiệm thời gian truy xuất và hạn chế việc quá tải webserver.Việc cấu hình bằng VCL sẽ giúp bạn linh hoạt hơn để cấu hình, Varnish sẽ trở nên có ích hơn nếu bạn có thể ứng dụng các quy tắt của VCL.Varnish có thể hoạt động được với các kỹ thuật Load Balancing.

Ở trên là những gì mình biết được về Varnish nên mình đã cố gắng giải thích nó theo hướng dễ hiểu nhất. Ở các bài viết tiếp theo của serie này, mình sẽ hướng dẫn các bạn cách cài đặt và thiết lập Varnish trên hai hệ điều hành phổ biến là Ubuntu và CentOS, đồng thời mình cũng sẽ hướng dẫn thiết lập trên hai webserver thông dụng là Apache và NGINX. Kế tiếp là mình sẽ giải thích về các quy tắt trong VCL để bạn có thể dễ dàng làm việc sau này.

Hãy nhớ rằng mình hướng dẫn và thiết lập theo cách mà mình đã làm thành công trên nhiều website khác nhau nên nếu bạn gặp các lỗi ngoài mong đợi, hãy Google thêm để biết cách fix nhưng mình chắc chắn là nếu bạn làm theo hướng dẫn của mình thì không có lỗi đâu vì mình đã test kỹ trên nhiều phiên bản hệ điều hành, và test trên nhiều dịch vụ máy chủ khác nhau như DigitalOcean, Linode, A2Hosting, Heroku,…Nếu bạn là người mới, mình khuyến khích các bạn nên sử dụng các dịch vụ máy chủ tại đây và tránh dùng các nền tảng máy ảo đám mây như Google Cloud, Amazon S3, Heroku vì những dịch vụ đó có cấu hình không giống như các dịch vụ máy chủ thông thường mà ta vẫn hay sử dụng.

A2Hosting giảm giá 51%

Hiện tại nếu bạn đang có ý định mua Shared Host quốc tế với tốc độ cao, hỗ trợ tối ưu riêng cho WordPress và ổ cứng SSD thì hiện nay A2Hosting đang có chương trình giảm giá 51% cho toàn bộ các gói Shared Host của họ, tức là bạn có thể sử dụng một gói host chất lượng cao với giá chỉ $3.92/tháng.

a2hosting-51off

A2Hosting hiện tại là một trong các dịch vụ Shared Host tốt nhất mà mình luôn khuyến khích các độc giả nên sử dụng cho website WordPress, bởi vì cấu hình tại A2Hosting luôn được tối ưu dành cho WordPress, và nếu bạn có sử dụng công cụ cài đặt WordPress tự động tại A2Hosting thì nó cũng sẽ tự cài cho bạn một plugin của riêng A2Hosting để hỗ trợ tối ưu tốc độ cho website.

Xem thêm: Đánh giá chất lượng A2Hosting

Hiện tại tất cả các gói host tại A2Hosting đều hỗ trợ ổ cứng SSD và khu vực lưu trữ RAID-10 để phòng chống việc mất dữ liệu. Với gói Turbo mới nhất của họ, website của bạn sẽ được tối ưu tốc độ tốt hơn nhờ việc sử dụng APC Opcode Cache để tăng tốc độ xử lý PHP trên website, ngay cả khi bạn làm việc trong backend của website. Nếu bạn vẫn băn khoăn việc chuyển dữ liệu từ host cũ về đây thì A2Hosting có hỗ trợ giúp bạn chuyển dữ liệu website về máy chủ của họ bằng thủ công và không giới hạn website chuyển về.

Đặc biệt hơn, nếu bạn mua host tại A2Hosting bằng cách click vào link trên thì cũng sẽ được hưởng dịch vụ cài đặt WordPress chuyên nghiệp miễn phí của mình, bất kể bạn có dùng mã giảm giá hay không.

Với chính sách 30 ngày hoàn tiền, bạn vẫn có thể hủy bỏ dịch vụ và hoàn tiền 100% trong vòng 30 ngày đăng ký nếu bạn thấy host tại đây không phù hợp. Do vậy, hãy nhanh chân lên trước khi khuyến mãi này hết hạn nhé vì A2Hosting chỉ thường khuyến mãi từ 10% đến 30% chứ ít khi có dịp giảm giá đến 51%, ngay cả dịp Black Friday cuối năm họ cũng chỉ giảm giá 50%.

Thứ Bảy, 31 tháng 1, 2015

Varnish – Tìm hiểu VCL

Khi sử dụng Varnish, chắc chắn bạn sẽ nghe nhiều đến VCL và nhất là tập tin /etc/varnish/default.vcl. Vậy VCL là gì? ý nghĩa của những đoạn code trong đó ra sao? Trong bài này mình sẽ giải thích khái quát cho các bạn hiểu về VCL để có thể tự tìm hiểu hơn ở trang Varnish Documentation. Cũng xin nói trước rằng các đoạn code trong VCL đa phần là dò tìm và so sánh giá trị nên sẽ sử dụng regex (biểu thức chính quy) rất nhiều nên đây là dịp tốt bạn nên tìm hiểu luôn về biểu thức chính quy.

VCL trong Varnish là chữ viết tắt của Varnish Configuration Language (ngôn ngữ cấu hình Varnish), đọc qua tên chắc bạn cũng biết nó là cái gì rồi. VCL được phân cấu trúc bởi các chương trình con (subroutines) và mỗi chương trình con sẽ đều có một chức năng khi các đoạn code bên trong mỗi chương trình con khớp với chỉ thị của các truy cập gửi vào server. Nghe có vẻ trừu tượng quá, bạn hãy tưởng tượng VCL có một số chương trình con trong VCL như chương trình trả dữ liệu về client, chương trình nhận dữ liệu về client,…và trong mỗi chương trình đó ta sẽ viết code để điều khiển nó làm việc như ý muốn. Ví dụ bạn có thể chỉ định Varnish không gửi cache đến các truy vấn truy cập vào website đang mang một cookie nào đó (ví dụ như cookie wordpress_logged_in của các truy vấn của người dùng đang đăng nhập vào WordPres).

Mặc dù VCL rất đơn giản nhưng lại cực kỳ mạnh mẽ bởi vì bạn có thể tự xây dựng một subroutine ngoài việc sử dụng các subroutine có sẵn của Varnish. Dưới đây là ví dụ của một đoạn code sử dụng subroutine vcl_recv để tùy biến việc nhận dữ liệu từ backend server vào Varnish.

sub vcl_recv { # Không load cache cho những người dùng WordPress đang đăng nhập (dùng cookie wordpress_logged_in) if ( req.http.cookie ~ "wordpress_logged_in" ) { return( pass ); }}

Điều này cũng có nghĩa là tất cả các code trong file default.vcl đều phải đặt trong một subroutine và một subroutine không thể tái sử dụng hai lần trong cùng một tập tin.

Nếu file default.vcl của bạn không có nội dung VCL nào ngoài dòng backend server để khai báo cổng kết nối của backend, thì tất cả các trang của bạn đều được gắn cache và tự động hủy (purge) sau 2 phút.

Cấu trúc code của VCL rất đơn giản và dễ hiểu, thoạt nhìn bạn có thể thấy nó có chút hơi na ná với ngôn ngữ C hoặc Perl. Một đoạn VCL được bao gồm thế này:

sub tên-chương-trình-con { // Các quy tắt thực thi}

Trong đó, sub là từ khóa khai báo một subroutine, các subroutine có sẵn luôn bắt đầu là vcl_ nhưng nếu bạn tự tạo subroutine thì bạn sẽ không có quyền đặt tên là vcl_.

Như mình đã nói ở trên, VCL có cấu trúc giống như C hoặc Perl nên việc một đoạn code VCL nhìn giống C là điều hiển nhiên, kể cả trong cú pháp.

Khi thiết lập giá trị kiểu chuỗi trong VCL, bạn chắc chắn rằng nó luôn được bọc trong dấu nháy đôi “…” và không được xuống hàng. Kể cả khi bạn dùng regex (biểu thức chính quy) thì việc khai báo các ký tự đặc biệt cũng phải được đặt trong cặp dấu nháy đôi.

req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$" )

Tuy là một ngôn ngữ đơn giản nhưng VCL cũng hỗ trợ một số toán tử như:

=Gán giá trị.==So sánh bằng giá trị tuyệt đối.~So sánh bằng giá trị tương đối/tương đương, hoặc sử dụng với regex.!Phủ định.&&Logical and||Logical or

Các subroutine mình khai báo trong đây là các subroutine ở Varnish 3. Trên phiên bản Varnish 4, một số subroutine đã được đổi tên, xem tại đây.

Xin nhắc lại rằng, subroutine nghĩa là một chương trình con để gom nhóm các đoạn code bên trong để nó sẽ thực thi dựa vào ý nghĩa của từng subroutine. Mặc định Varnish cung cấp sẵn một số subroutines như:

Các code trong nhóm này sẽ được gọi ra khi bắt đầu khách gửi một truy vấn đến server, hoặc sau khi hoàn thành một truy vấn đã được nhận và phân tích. Mục đích của subroutine này là để điều hướng kiểm tra dữ liệu của người gửi truy vấn nhằm có thể điều hướng cho Varnish gửi truy vấn thẳng đến backend server mà không cần trả lại cache cho khách.

Tiến trình xử lý của subroutine này sẽ được kết thúc bằng return(), nó có thể chứa các từ khóa như:

hash – Khi return bằng từ khóa này, trang của người dùng sẽ được Varnish hiểu như là có thể lưu cache bằng cách gán cho nó một mã băm riêng biệt, lúc này Varnish sẽ chuyển đến subroutine vcl_hash để nó làm việc.pass – Khi return bằng từ khóa này, Varnish sẽ gửi truy vấn đến trực tiếp backend server, bạn có thể hiểu nếu pass thì khách sẽ truy cập thẳng vào backend server mà không có cache.pipe – Chuyển request đến Pipe Mode dựa trên subroutine vcl_pipe.purge – Chuyển đối tượng request thành một biến thể để loại bỏ, nó sẽ được xử lý thông qua subroutine vcl_hash và vcl_purge.

Ngay sau khi subroutine nếu có chuyển quá trình xử lý đến Pipe Mode thông qua việc return(pipe) thì các code trong subroutine này sẽ được thực thi. Hãy hiểu rằng, Pipe Mode là Varnish sẽ mở một kết nối hai chiều TCP Proxy để request có thể gửi thẳng đến backend server và ngược lại. Hãy nhớ rằng, nếu bạn có sử dụng subroutine này thì không có bất cứ subroutine nào khác được xử lý sau khi Pipe Mode kết thúc. Pipe Mode sẽ được kết thúc bằng return() với một số từ khóa như:

pipe – chuyển request vào Pipe mode.

Subroutine này sẽ được áp dụng khi request được gửi vào pass mode. Pass mode nghĩa là các request sẽ được gửi đến thẳng backend server và backend server sẽ trả lại dữ liệu mà không truy cập vào bất cứ đối tượng cache nào.

Subroutine này sẽ được kết thúc bằng return() với một số từ khóa như:

fetch – Báo hiệu request này đã đi vào pass mode và backend server bắt đầu xử lý.restart – Bắt đầu lại quá trình chuyển giao request.

Subroutine vcl_hit sẽ được gọi ra khi request đã tìm thấy một bản cache phù hợp thành công trong Varnish. vcl_hit sẽ được kết thúc quá trình bằng return() với các từ khóa:

deliver – Chuyển giao đối tượng cache cho người gửi request.fetch – Đồng bộ lại dữ liệu của đối tượng đã được lưu cache với nội dung trả về từ backend server. Lúc này, subroutine vcl_miss sẽ bắt đầu làm việc.pass – Gửi request vào pass mode với vcl_pass.restart – Bắt đầu lại quá trình chuyển giao request.

Subroutine này sẽ được kích hoạt nếu request không tìm thấy đối tượng cache phù hợp, hoặc request được return(fetch) ở subroutine vcl_hit.

Nó cũng sẽ được kết thúc bằng return() với các từ khóa như sau:

fetch – lấy lại đối tượng đã được request đến backend. Nó sẽ được control qua subroutine vcl_backend_fetch.pass – Đưa request vào pass mode và xử lý bằng vcl_pass.restart – Bắt đầu lại quá trình chuyển giao request.

Ngay sau khi các request được xử lý bằng vcl_recv mà được return(hash) thì subroutine này sẽ làm việc. Nó được sử dụng như để tìm ra một đối tượng đã được cache trong Varnish bằng một mã băm riêng biệt.

Riêng với subroutine này nó chỉ có một cách kết thúc quá trình là return(lookup) để tìm một đối tượng cache.

Được gọi ra khi quá trình purge cache bắt đầu. Nó sẽ được kết thúc quá trình bằng return() với các từ khóa:

restart – Bắt đầu lại quá trình chuyển giao request.

Subroutine này sẽ được gọi ra trước khi bất cứ đối tượng nào được gửi cho người gửi request, ngoại trừ kết quả của subroutine vcl_synth. Nó kết thúc bằng return() với các từ khóa:

deliver – Chuyển giao đối tượng cache cho người gửi request.restart – Bắt đầu lại quá trình chuyển giao request.

Subroutine này sẽ được thực thi khi backend server bị lỗi không truy cập được để lấy dữ liệu. Trường hợp dùng nhiều nhất là khai báo hàm synthetic() trong subroutine này để tạo một trang báo lỗi trong Varnish. Subroutine này mình sẽ có một số ví dụ ở phần sau.

Ngoài tập tin default.vcl mặc định, bạn có thể tạo ra nhiều file.vcl khác và sau đó bạn có thể sử dụng từ khóa include trong file default.vcl để load nó.

include "wordpress.vcl";include "main.vcl";

Nếu bạn có đọc qua nội dung VCL mà mình đã kêu bạn copy thì sẽ thấy có một số biến như req.url, req.request,…Vậy nó là gì, Varnish có những biến gì? Ở phần này bạn sẽ hiểu. Danh sách các biến toàn cục của VCL có rất nhiều nên mình chỉ liệt kê một số biến hay sử dụng mà thôi, bạn có thể xem chi tiết tại đây.

Ngoài ra, các biến toàn cục này có thể được gán giá trị bằng từ khóa set hoặc unset để bỏ gán.

nowHiển thị thời gian hiện tại.

Các biến dưới đây sẽ lấy thông tin ở backend server:

.hostHostname hoặc địa chỉ IP của Varnish Server..portLấy số cổng kết nối đang được Varnish sử dụng.

Các biến dưới đây sẽ dùng được trong một quá trình xử lý các request:

client.ipĐịa chỉ IP của máy khách đang gửi truy vấn.client.identityMã chứng minh của khách truy cập.server.hostnameTên hostname của máy chủ.server.ipĐịa chỉ IP của máy chủ mà khách truy cập đang truy cập vào.server.portPort của máy chủ mà khách truy cập đang truy cập vào.req.requestLoại request: POST, GET, TRACE, HEAD,….req.urlĐịa chỉ URL được gửi request.req.protoGiao thức HTTP được gửi request.req.backendTên của backend server được xử lý request.req.backend.healthyWhether the backend is healthy or not. Requires an active probe to be set on the backend.req.http.headerThông tin header của địa chỉ gửi request.req.hash_always_missNếu biến này được thiết lập giá trị là true, thì Varnish sẽ không quan tâm đến bất kỳ đối tượng nào được trả về từ backend server.req.restartsHiển thị số lần request đã được restart.

Ở trên bạn đã đọc qua một số khái niệm quan trọng trong VCL rồi, bây giờ mình sẽ cho bạn một số ví dụ về VCL để bạn hiểu hơn về cách làm việc của nó.

Cho request pass vào backend server trong đường dẫn http://domain/wp-admin hoặc wp-admin:

sub vcl_recv { # Pass các request trang admin vào backend if ( ! ( req.url ~ "wp-(login|admin)" ) ) { return (pass); }}

Hiển thị trang báo lỗi nếu backend server bị ngưng hoạt động.

sub vcl_backend_error { set obj.http.Content-Type = "text/html; charset=utf-8"; synthetic {" We'll Be Right Back!

WEBSITE ĐANG BỊ NGHẼN - HÃY ĐỢI MỘT CHÚT

Website sẽ tự động làm mới sau mỗi 3 giây

"}; return(deliver);}

Chặn liên kết ở các website khác. Ví dụ như chặn hiển thị hình ảnh từ link của bạn trên website khác.

sub vcl_recv { if (req.http.host == "www.example.com" && req.url ~ "^/fun/" && (req.http.referer && req.http.referer !~ "^http://www.example.com/")) {error 403 "No hotlinking please";}}

Một số nguồn cấu hình VCL khác như:

Trong bài này có lẻ mình đã viết hơi dài rồi và có thể kết thúc serie Varnish 3 tại đây. Hãy nhớ rằng bài viết của mình chỉ nói khái quát chứ không thể nói chi tiết được VCL của Varnish nên hãy lên Google gõ “Varnish Documentation” để biết thêm chi tiết để có hiểu nó toàn diện hơn.

Hy vọng với serie Varnish này, các bạn có thể dễ dàng áp dụng phần mềm này vào máy chủ của mình để có thể tối ưu hơn về tốc độ của website.

Tổng hợp plugin WordPress hay – #2

Thay vì việc chia danh sách các plugin hay mỗi tháng như bài này, thì bắt đầu từ bài này mình sẽ chia danh sách các plugin hay mà mình tìm được theo dạng số và mỗi kỳ sẽ là một số để bạn theo dõi tiện hơn, cũng như tránh các hiểu lầm không đáng có.

Trong số này, mình muốn giới thiệu đến các bạn một số các plugin miễn phí và trả phí hay nhất mà mình đã sưu tầm được trong tháng vừa qua. Các plugin này tất cả đều đã được mình thử nghiệm và chắc chắn nó vẫn đang hoạt động rất tốt nên bạn có thể yên tâm sử dụng nha.

title-experiments-plugin

Nếu bạn quan tâm đến kỹ thuật A/B Testing để theo dõi và đánh giá website nhằm tối ưu website theo cách tốt nhất, thì plugin Title Experiments Free này sẽ giúp bạn dễ dàng đánh giá sự hiệu quả của việc đặt tiêu đề post và page. Nó sẽ lưu lại các lần bạn thay đổi tiêu đề và kiểm tra xem loại tiêu đề nào được click vào nhiều nhất để hiểu hơn về thị hiếu của người truy cập.

duplicate-merge-posts-plugin

Nếu bạn thường xuyên sửa lại các post cũ trong WordPress sẽ thấy nó có một nhược điểm là bạn không thể lưu nháp lại một bài đã được đăng (published). Với plugin này, bạn có thể khắc phục nhược điểm đó bằng cách tạo một bản sao của bài cần chỉnh sửa, sau đó có thể dễ dàng gộp bản sao đã được chỉnh sửa vào bài cũ mà không cần sửa trực tiếp bài cũ, quá tiện phải không?

better-search-replace

Trên một số trường hợp, bạn sẽ cần phải cập nhật lại một đoạn nội dung gì đó trong database bằng cách tìm kiếm và thay thế. Ví dụ mỗi khi bạn đổi domain cho website thì chắc chắn sẽ phải cần tìm kiếm đoạn domain cũ trong database và thay thế nó thành domain mới. Plugin này sẽ giúp bạn làm việc đó dễ dàng hơn thay vì sử dụng các plugin Search & Replace phức tạp khác. Bạn có thể tùy chỉnh tìm kiếm và thay thế trên toàn bộ database hoặc một table dữ liệu riêng biệt.

distraction-preview-button

Plugin này rất đơn giản, đó là chèn một nút Preview nội dung trên khung soạn thảo vì ở chế độ soạn thảo chống làm phiền, nút Preview sẽ bị ẩn đi nên bạn phải quay trở lại chế độ soạn thảo thông thường mới có thể xem trước nội dung.

simple-post-expiration

Nếu bạn muốn đặt thời hạn cho một post nào đó thì plugin này có thể giúp bạn làm đơn giản hơn. Bạn có thể gắn thời gian hết hạn cho post và mỗi khi nó hết hạn thì sẽ hiển thị chữ Expired trên tiêu đề để người ta biết post đó đã hết hạn rồi. Còn nếu bạn muốn post đã hết hạn là không còn hiển thị nữa thì có thể sử dụng plugin nhiều chức năng hơn tên là Post Expirator.

kraken-image-optimizer

Plugin này sẽ giúp bạn tự động giảm dung lượng ảnh trên website với hơn 60% mà không làm giảm chất lượng nhiều thông qua API của dịch vụ Kraken.io.

clean-image-filenames

Nếu bạn đã trót lỡ đặt tên ảnh là tiếng Việt hoặc có ký tự đặc biệt thì hãy sử dụng plugin này để đổi tên lại toàn bộ các hình ảnh có trên website, bởi vì nhiều cấu hình webserver sẽ không thể hiển thị được các hình ảnh có ký tự đặc biệt.

avh-extended--categories-widget

Nếu bạn muốn hiển thị danh sách các post categories ra sidebar nhưng lại không muốn sử dụng cái Widgets. Mặc định mỗi website WordPress đều…" href="http://thachpham.com/glossary/widget" target="_blank">widget Categories có sẵn, thì bạn có thể cài plugin này vào để có một widget hiển thị category nhiều chức năng hơn. Bạn có thể loại bỏ một số category không muốn hiển thị, hiển thị kiểu phân cấp và hiển thị icon RSS cho mỗi category.

sidekick-plugin

Nếu bạn chuyên làm website cho khách hàng, sử dụng WordPress thì đây là một “vũ khí” mới mà bạn nên trang bị để hướng dẫn khách hàng sử dụng website dễ hiểu hơn. Nó sẽ giúp bạn tạo ra một quy trình hướng dẫn trực quan ngay khi người dùng vào Dashboard, bạn có thể chèn lời nói vào trong đó nữa. Xem demo tại đây.

styleguide-plugin

Nếu bạn là người mới dùng WordPress, không có nhiều kiến thức CSS để tùy biến lại màu sắc của các theme mặc định thì Styleguide đúng là trợ thủ đắc lực cho bạn làm việc này. Khi cài plugin này vào ở các giao diện mặc định, bạn sẽ có quyền tùy biến lại màu sắc và các thông tin về giao diện đến từng chi tiết nhỏ nhất.

widget-visibility-time-schelduler

Đơn giản là bạn có thể thiết lập thời gian ngừng hiển thị widget.

doken-lite

Mới đây, plugin Dokan dành cho Woocommerce đang rất đình đám ra mắt một phiên bản miễn phí với hạn chế các tính năng quan trọng. Dokan là plugin giúp bạn biến trang shop Woocommerce của bạn thành một trang mạng xã hội thương mại điện tử với các tính năng cho phép người dùng bán hàng của họ trên shop của bạn.

viral-social-sharing-by-up

Bây giờ bạn có thể giúp thành viên của bạn thấy có động lực hơn bằng cách tích hợp dịch vụ UP vào các nút chia sẻ bài viết lên mạng xã hội. Khi người dùng share nội dung của bạn, họ có thể nhận được số điểm tương ứng trong tài khoản UP của họ và có thể quy đổi ra tiền.

perfect-seo-url

Nếu bạn đang sử dụng Woocommerce và cần đổi lại cấu trúc đường dẫn của category, sản phẩm, các thuộc tính,….thì đây là plugin tốt nhất hiện tại để làm được việc đó. Kể cả việc đường dẫn của bạn có một slug /product/ trên đó thì nó vẫn có thể giúp bạn xóa cái slug đó đi mà không làm ảnh hưởng đến website.

jmedia-category

Plugin này tuy đơn giản nhưng lại có rất nhiều người cần đó là tạo một taxonomy tên là Category dành cho hình ảnh bạn upload lên để bạn dễ dàng sắp xếp lại hình ảnh có trên website, và khi chèn ảnh vào bài bạn cũng có thể lọc xem ảnh theo category rất tiện lợi trong việc dùng lại ảnh cũ.

blog-manager-plugin

Có thể bạn sẽ cần tùy biến lại giao diện hiển thị các bài viết trên website của mình theo nhiều phong cách khác nhau, nhưng lại gặp rào cản về kiến thức lập trình để có thể làm được như ý muốn. Blog Manager sẽ giúp bạn tạo ra nhiều kiểu hiển thị bài viết trên website, bạn có thể chèn kiểu hiển thị đó vào page và vào thiết lập page làm trang chủ là được.

uberchat

Nếu bạn đang sử dụng các dịch vụ chat ới khách hàng như Zopim hay Subiz thì có thể biết là các dịch vụ đó đều là trả phí hàng tháng. Nếu bạn không muốn trả phí hàng tháng như thế nữa thì có thể trả tiền một lần để sử dụng plugin UberChat này, nó sẽ có chức năng cho khách hàng chat với bạn qua khung chat trên website, và bạn có thể nhận được thông báo chat và trả lời khách hàng bằng một phần mềm trên Windows có kèm theo trong plugin.

wordpress-typewriting-plugin

Một plugin đơn giản, dễ sử dụng để bạn tạo ra một đoạn text có hiệu ứng typewriting, bạn có thể hiển thị nó ra thành một shortcode và chèn bất cứ chỗ nào.

ajax-pagination-infinitescroll

Một plugin đơn giản để bạn có thể sử dụng cả hai hiệu ứng tải bài bằng AJAX đó là sử dụng AJAX cho nút phân trang hoặc Infinite Scroll (kéo xuống dưới bài mới sẽ tự load ra). Tuy nhiên một điều cần lưu ý là plugin này không phải kiểu “cắm vào và chạy” mà bạn sẽ cần thiết lập vùng chọn của các khu vực hiển thị post để nó load nội dung ra chính xác.

Như vậy là trong số này chúng ta có được 20 plugin miễn phí lẫn trả phí rất hay mà bạn ít nhất nên biết hoặc có thể sử dụng qua. Hy vọng trong kỳ tới sẽ có sự góp mặt thêm của nhiều plugin tuyệt vời hơn.