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.