Thứ Hai, 24 tháng 11, 2014

Tìm hiểu các hàm điều kiện của WordPress

Trong lập trình nói chung, các điều kiện rẽ nhánh là một tính năng không thể thiếu trong bất kỳ ngôn ngữ lập trình nào vì hầu như việc sử dụng các điều kiện để rẽ nhánh các hành động làm việc được sử dụng khá thường xuyên. Chẳng hạn như nếu số A có giá trị bằng 0 thì hành động 1 sẽ được thực thi và ngược lại.

Quay về với WordPress, chúng ta có thể sử dụng điều kiện rẽ nhánh trong PHP để làm việc như nếu trang hiện tại là trang A thì hành động sẽ thực thi, vậy làm thế nào để WordPress có thể hiểu được trang hiện tại đang thực thi là trang A? Rất dễ dàng để thực hiện việc kiểm tra này, thậm chí phải gọi là rất dễ thông qua các hàm điều kiện của WordPress. Hàm điều kiện trong WordPress nghĩa là một hàm được build sẵn trong mã nguồn để trả về giá trị là TRUE hay FALSE trong từng thời điểm tương ứng.

Chẳng hạn bạn có thể sử dụng các hàm điều kiện này để kiểm tra category A có post hay không, trang hiện tại là trang bài viết hay trang chủ,…Nếu bạn là người mới dùng WordPress, không có nhu cầu tìm hiểu sâu vào mã nguồn thì vẫn có rất nhiều cơ hội sử dụng các hàm điều kiện này, ý tưởng thực tiễn nhất là kiểm tra trang để ẩn/hiện widget tùy ý bằng plugin Widget Logic.

Đã gọi là hàm điều kiện thì giá trị trả về của tất cả hàm này chỉ có TRUE hoặc FALSE, nếu kết quả trả về là TRUE thì là thỏa điều kiện và FALSE là không thỏa điều kiện. Các hàm này đa phần là bắt đầu bằng chữ is (kiểm tra xem đối tượng của phải là cái gì đó) và có một vài hàm bắt đàu bằng chữ has (kiểm tra đối tượng có một cái gì đó hay không) hoặc có kèm chữ exist (kiểm tra đối tượng có tồn tại hay không). Dễ hiểu nhất thì nên lấy ví dụ là hàm is_home(), hàm này sẽ kiểm tra xem trang đang thực thi có phải là trang chủ hay không.

Hàm điều kiện có chức năng là trả về giá trị TRUE hoặc FALSE, do đó ta sử dụng nó như một giá trị kiểm tra trong cú pháp điều kiện rẽ nhánh trong PHP. Ví dụ mình muốn hiển thị chữ “Chào mừng các bạn” ở trang chủ nhưng không hiển thị ở các trang khác thì sẽ có code như sau:

if ( is_home() ) {echo "Chào mừng các bạn";}

Nếu bạn biết qua PHP rồi thì đoạn trên cực kỳ dễ hiểu. Tức là hàm is_home() sẽ có nhiệm vụ kiểm tra xem trang khách đang truy cập có phải là trang chủ hay không, nếu kết quả hàm is_home() trả về là TRUE thì thực thi từ khóa echo phía dưới để hiển thị chữ “Chào mừng các bạn”, nếu là FALSE thì không làm gì cả.

Chúng ta cũng có thể sử dụng nhiều hàm điều kiện cho một lần kiểm tra:

if ( is_home() && is_user_logged_in() ) {echo "Chào mừng thành viên";}

Đoạn trên nghĩa là chúng ta thêm 2 điều kiện vào, một là is_home() để kiểm tra trang chủ và hai là is_user_logged_in() để kiểm tra thành viên đó có đăng nhập hay không. Lưu ý một điều, ký tự && nghĩa là , tức là phải thỏa mãn cả 2 điều kiện thì hành động mới được thực thi. Bạn có thể sử dụng cú pháp || (tức là HOẶC) để đặt 2 điều kiện và chỉ cần thỏa mãn 1 trong 2 là hành động thực thi.

Trong một vài trường hợp, có thể bạn cần kiểm tra ngược lại, ví dụ nếu trang hiện tại KHÔNG PHẢI (NOT) là trang chủ thì sẽ thực hiện một việc gì đó. Để làm việc kiểm tra đó, bạn sẽ cần gán thêm ký tự ! (dấu chấm cảm) ở trước hàm điều kiện. Ví dụ:

if ( !is_home() ) {echo "Bạn không đang ở trang chủ";}

Tất cả các hàm điều không phải cái nào cũng có tham số nhưng có rất nhiều hàm điều kiện cho phép chúng ta kiểm tra từng giá trị riêng lẻ trong đối tượng đó. Ví dụ nếu bạn cần kiểm tra xem trang hiện tại có phải là category 123 hay không thì sẽ dùng đến nó. Nhưng bạn có thể không điền tham số nếu không cần thiết vì nó không bắt buộc.

Tất cả hàm điều kiện đều cho phép bạn đặt tham số với 3 kiểu dữ liệu là chuỗi ký tự (String), số (Numeric) và mảng (Array) và mỗi kiểu giá trị đều có ý nghĩa riêng của nó. Ví dụ, mình muốn kiểm tra xem post hiện tại họ đang xem có phải là post có số ID là 69 hay không thì mình sẽ viết code như sau:

if ( is_single( 69 ) ) {echo "Hiện quảng cáo 69 đê";}

Hoặc chúng ta sẽ chèn thêm một cái array vào để kiểm tra cùng lúc nhiều post:

if ( is_single( array( 69,96 ) ) ) {echo "Hiện quảng cáo 69 và 96 đê";}

Cũng xin nói thêm rằng, cụm từ Post mà mình nhắc đến trong đây là nó bao gồm Custom Post Type và cái Post mặc định vì bạn có thể điền ID của bất cứ post type nào bạn cần kiểm tra.

Kiểm tra slug của một category nào đó với kiểu dữ liệu string:

if ( is_category( 'thu-thuat' ) ) {echo "Bạn đang ở category Thủ thuật";}

Danh sách các hàm điều kiện của WordPress

Nãy giờ chắc bạn cũng thắc mắc là làm sao để biết WordPress đang hỗ trợ hàm điều kiện nào đúng không? Đây, nó ở ngay đây, mình sẽ thiệt kê ra và kèm chú thích cho các bạn hiểu chức năng. hàm nào mình có kèm thêm $args bên trong nghĩa là hàm đó có hỗ trợ tham số.

 comments_open( $args ) Kiểm tra chức năng bình luận của post hiện tại có đang được mở hay không.has_tag( $args ) Kiểm tra post hiện tại có được đặt Tag hay không.has_term ( $args ) Kiểm tra post hiện tại có chứa một term của bất kỳ taxonomy nào hay không. Ví dụ bạn có một category mang tên là ABC thì cái ACB đó chính là term của taxonomy tên Category.in_category( $args ) Kiểm tra post hiện tại có nằm trong category nào hay không.is_404() Kiểm tra trang bạn đang truy cập có bị lỗi 404 hay không.is_admin() Kiểm tra bạn có đang truy cập vào trang quản trị của WordPress hay không.is_archive() Kiểm tra xem bạn có đang truy cập vào trang lưu trữ của bất kỳ một taxonomy nào hay không.is_attachment() Kiểm tra xem bạn có đang truy cập vào trang hiển thị tài liệu đính kèm trong post hay không (Media).is_author( $args ) Kiểm tra bạn có đang xem trang lưu trữ của một tác giả nào đó hay không.is_child_theme() Kiểm tra nếu theme hiện tại đang sử dụng là child theme hay theme bình thường.is_comments_popup() Kiểm tra trang hiện tại đang truy cập có phải là trang popup của comment hay không.is_date() Kiểm tra trang đang truy cập có phải là trang lưu trữ dạng ngày tháng hay không.is_day() Kiểm tra xem trang bạn đang xem có phải là trang lưu trữ theo ngày hay không.is_feed() Kiểm tra xem đối tượng bạn đang xem có thuộc trang RSS Feed hay không.is_front_page() Kiểm tra xem trang hiện tại bạn đang xem có phải là trang chủ mà đã được thiết lập trong Settings -> Reading hay không.is_home() Kiểm tra xem trang hiện tại của bạn có là trang chủ hay không. Kết quả sẽ trả về là TRUE nếu bạn không thiết lập trang chủ trong Settings -> Reading hoặc bạn thiết lập một trang trở thành Post page trong Settings -> Reading.is_month() Kiểm tra xem trang đang xem có phải là trang lưu trữ theo háng hay không.is_multi_author() Kiểm tra xem website đang truy cập có nhiều hơn 1 tác giả đăng bài hay không.is_multisite() Kiểm tra xem trang hiện tại có phải là WordPress Multisite hay không.is_main_site( $args ) Kiểm tra xem trang hiện tại có phải là website chính trong mạng WordPress Multiste hay không.is_page( $args ) Kiểm tra trang hiện tại có phải thuộc Page hay không.is_page_template( $args ) Kiểm tra page hiện tại có dùng Page Template hay không.is_paged() Kiểm tra xem trang hiện tại có được phân trang hay không. Không áp dụng cho Post và Page.is_preview() Kiểm tra xem trang bạn đang xem có phải là trang xem thử bài viết ở chế độ viết nháp hay không.is_rtl() Kiểm tra ngôn ngữ đang sử dụng cho website có thuộc danh sách các quốc gia sử dụng bố cục đọc từ phải trang trái hay không. Ví dụ như tiếng Ả Rập sẽ đọc từ phải sang trái.is_search() Kiểm tra trang đang xem có phải là trang hiển thị kết quả tìm kiếm hay không.is_single( $args ) Kiểm tra xem trang hiện tại có phải là trang hiển thị chi tiết nội dung của bất kỳ post type nào hay không. Chỉ áp dụng cho các post type có tham số Hierarchical là True, tức là giống Post.is_singular( $args ) Kiểm tra xem trang hiện tại có phải là trang hiển thị chi tiết nội dung của bất kỳ post type nào hay không, nó giống như is_single() nhưng áp dụng cho toàn bộ loại post type và nó cũng sẽ trả kết quả là TRUE nếu như is_single(), is_page() và is_attachment() trả kết quả về là TRUE.is_sticky( $args ) Kiểm tra xem post đang xem có đang được đánh dấu vào nút Sticky hay không.is_super_admin( $args ) Kiểm tra thành viên đang truy cập có phải là Super Admin hay không.is_tag( $args ) Kiểm tra xem trang hiện tại có phải là trang hiển thị danh sách bài viết của một tag nào đó không.is_tax( $args ) Trả về TRUE nếu trang hiện tại là trang hiển thị danh sách bài viết của một taxonomy nào đó.username_exists( $args ) Kiểm tra sự tồn tại của một username.is_taxonomy_hierarchical( $args ) Kiểm tra một taxonomy nào đó có được bật tính năng hierarchical hay không.is plugin active( $args ) Trả về TRUE nếu một plugin nào đó được kích hoạt.in_the_loop() Kiểm tra đối tượng hiện tại có đang nằm trong loop không.is_activate_sidebar( $args ) Kiểm tra một sidebar nào đó có đang được sử dụng hay không.is_activate_widget( $args ) Kiểm tra một widget nào đó có đang được sử dụng (đưa vào sidebar) không.is_dynamic_sidebar() Kiểm tra sidebar xem nó đã được thêm widget chưa.is_user_logged_in() Kiểm tra người đang xem có phải là thành viên đã đăng nhập hay không.wp_is_mobile() Kiểm tra thiết bị đang truy cập có phải là điện thoại di động hay không. Ngoài ra bạn có thể có thêm được nhiều hàm có chức năng tương tự thế này bằng cách cài plugin, xem thêm bài Kỹ thuạt xây dựng Adaptive Theme.

Widget Logic là plugin cho phép bạn điều khiển việc hiển thị từng widget ở những trang mà mình cần cho widget hiển thị thông qua các hàm điều kiện ở trên, đây là một cách làm quen với hàm điều kiện dành cho những bạn mới học ngại viết nhiều code.

Sử dụng Widget Logic cũng khá đơn giản, sau khi kích hoạt plugin thì bạn sẽ cần mở widget cần thêm hàm điều kiện ra và viết hàm điều kiện ở bên dưới phần Widget Logic.

widget-logic

Ở bài này mình đã nói qua khá chi tiết và đầy đủ về các hàm điều kiện có sẵn trong WordPress và có thể nó sẽ rất có ích cho bạn trong nhiều bài toán khác nhau cần xử lý. Thực ra đây là vấn đề khá đơn giản mà mình từng nghĩ chắc nhiều người cũng biết nên mình đã không nói qua, ai ngờ lại nhận được khá nhiều câu hỏi liên quan nên mình viết bài cụ thể luôn.


This post was made using the Auto Blogging Software from WebMagnates.org This line will not appear when posts are made after activating the software to full version.

Tạo máy ảo trên máy tính với Vagrant và VirtualBox

Trong các bài học VPS căn bản của mình, để thực hành bạn sẽ cần một VPS (Virtual Private Server) nhưng điều này đồng nghĩa với việc bạn phải bỏ một khoản tiền ra để trả phí cho quá trình học tập này. Mà theo thói quen của nhiều người sử dụng máy tính nói chung và dân IT nói riêng, việc hạn chế tiêu tiền càng ít càng tốt, mình không nói về vấn đề này vì đó là quan điểm riêng của mỗi người.

Vậy thì nếu bạn không có VPS nhưng muốn học VPS thì sao? Nghe cũng có vẻ lạ đấy nhưng không phải là không thể, bạn có thể cài các phần mềm hỗ trợ tạo máy ảo vào máy tính như VirtualBox, VMWare và cài hệ điều hành CentOS hoặc Ubuntu vào để làm một cái server Linux ảo để thực hành.

Dùng VirtualBox hay VMWare thì rất là tốt và hầu hết chúng ta đều phải sử dụng nó, nhưng cái vấn đề gặp phải khi làm thủ công như vậy đó là bạn sẽ mất thời gian cài đặt (bao gồm bước tạo máy ảo và thiết lập hệ điều hành cho nó), và đặc biệt là hệ điều hành CentOS không phải ai cũng có thể cài trót lọt nó để sử dụng như một webserver vì sẽ cần cấu hình khá nhiều sau khi cài xong.

Ở bài này, mình sẽ giới thiệu bạn đến một công cụ khác mà bạn có thể sử dụng kèm với VirtualBox hoặc VMWare để tạo máy ảo trong thời gian nhanh nhất, đơn giản nhất và chuyên nghiệp nhất đó là công cụ Vagrant.

Vagrant là một ứng dụng thêm dành riêng cho VirtualBox và VMWare để hỗ trợ người dùng tạo ra các máy ảo trên máy tính theo nhu cầu của mình và hỗ trợ quản lý toàn bộ máy ảo qua các dòng lệnh, hỗ trợ sẵn các box (bạn có thể hiểu “box” là một gói hệ điều hành với các thiết lập riêng biệt), đặc biệt  là bạn có thể chuyển thiết lập các máy ảo trong máy mình sang một máy tính khác (re-package), hoặc cho phép các thành viên cùng team với bạn truy cập vào thư mục riêng trên máy chủ để sửa/xem file mà họ không cần cài đặt bất cứ cái gì, miễn là dùng chung mạng LAN (Mạng nội bộ – Local Area Network), thậm chí bạn có thể đưa máy chủ của bạn lên môi trường internet chỉ với vài dòng lệnh đơn giản.

Hoặc nếu bạn đang deploy ứng dụng trên cloud server của Amazon EC2 hoặc Rackspace, Vagrant có thể giúp bạn dễ dàng setup giống như bạn làm trên máy tính và đồng bộ thiết lập này cho các server khác chỉ với vài dòng lệnh mà không cần mất công setup từng cái. Vagrant cũng hỗ trợ hầu hết mọi hệ điều hành hiện nay nên bạn không cần phân vân

Nói tóm lại, tuy rằng trong bài này mình sẽ nói về cách dùng Vagrant cơ bản nhưng khi bạn đã hiểu về nó, tự khắc bạn sẽ thấy Vagrant có ích như thế nào trong môi trường làm việc với web nói riêng và ảo hóa máy tính nói chung.

https://www.youtube.com/watch?v=s30E7ssEQWI

Ở bài này mình sẽ hướng dẫn cách cài đặt và sử dụng Vagrant trên hệ điều hành Windows (mình dùng Windows 8.1), nhưng nếu bạn dùng các hệ điều hành Linux như Ubuntu, Mac,…thì sẽ cài đặt dễ hơn vì đã có sẵn công cụ terminal nên bạn cứ làm theo, không cần cài đặt Git Bash ở bước 2.

Trước khi cài Vagrant, bạn nên cài VirtualBox vì nếu bạn muốn dùng Vagrant với VMWare thì bạnsẽ phải mất tiền. Bạn có thể tải phần mềm VirtualBox về và cài đặt vào máy như một phần mềm bình thường, yên tâm đây là phần mềm hoàn toàn miễn phí.virtualbox

Tại sao lại có Git ở đây? Bởi vì chúng ta sẽ sử dụng và điều khiển Vagrant qua bằng lệnh linux nên nếu dùng Windows thì sẽ hơi bất tiện khi dùng cái ứng dụng cmd có sẵn. Do vậy chúng ta cần một phần mềm để hỗ trợ giả lập môi trường UNIX trên Windows và công cụ Git có hỗ trợ cái này, mặc khác Vagrant rất có ích trong việc dùng chung với Git nên cứ cài sẵn để sau này cần thì dùng chung luôn.

Đầu tiên bạn truy cập vào http://git-scm.com/download/win để tải Git dành cho Windows phiên bản mới nhất. Sau đó chạy file vừa tải về để cài đặt và chọn tùy chọn như hình dưới.

git-install-windows git-install-windows-2

git-install-windows-3

Sau khi cài xong, bạn có thể thấy máy tính mình có thêm một ứng dụng tên là Git BashGit GUI khi vào menu Start trên máy tính, chúng ta chỉ cần sử dụng Git Bash trong khuôn khổ bài viết này. Mở lên thì bạn sẽ có cửa sổ nhập lệnh như thế này:

git-bash

Tạm thời để đó đi, chúng ta cần cài thêm Vagrant nữa.

Ứng dụng Vagrant sẽ tự động thêm vào các chương trình command line trên Windows/Linux sau khi cài đặt nên cũng không có gì khó cả. Trước tiên bạn cần truy cập vào https://www.vagrantup.com/downloads.html và tải gói cài đặt tương ứng với hệ điều hành mà bạn đang dùng.

Tải về và cài đặt như một phần mềm bình thường. Cài xong bạn sẽ cần khởi động lại máy tính để hoàn tất. Sau đó là hãy kiểm tra bằng cách mở cái Git Bash lên và gõ vagrant -h xem nó có hiện ra các thông tin trợ giúp không. Nếu có thì bạn đã cài Vagrant thành công.

vagrant-help

Trước khi sử dụng, mình cần nói sơ qua về các quy trình để có một máy chủ ảo nhằm tránh bỡ ngỡ cho nhiều bạn.

Trong Vagrant, nó có một khái niệm bạn cần biết rõ đó là Box. Box có nghĩa là một gói hệ điều hành và có nhiều box đã cài sẵn một số ứng dụng cần thiết, chẳng hạn như box CentOS 6.5 32bit, CentOS 6.5 64bit, Ubuntu 12.04 có sẵn LAMP,…Bạn có thể tải các box này về để sẵn ở máy và sau đó bạn có thể sử dụng box này cho các máy ảo tùy thích.

Khi dùng Vagrant, bạn sẽ cần tạo một thư mục riêng cho mỗi máy ảo và mỗi thư mục này sẽ chứa các thiết lập cho 1 máy ảo. Bởi vì khi khởi động, bạn sẽ cần truy cập vào thư mục của máy ảo cần khởi động và sử dụng lệnh vagrant up để khởi động nó lên.

Cũng nên nói lại rằng, tất cả các thao tác ở Vagrant đều thông qua lệnh. Nếu bạn dùng Windows thì bật phần mềm Git Bash vừa cài đặt ở trên, còn Linux thì dùng Terminal.

Sơ sơ là như vậy, còn chi tiết mình sẽ trình bày ở dưới.

Sau khi cài đặt, Vagrant sẽ không có box sẵn mà bạn sẽ phải cần nạp nó về máy. Danh sách các box và đường dẫn của nó bạn có thể xem tại https://vagrantcloud.com/discover/featured.

Bây giờ hãy mở Git Bash lên và tiến hành gõ như sau:

vagrant box add chef/centos-6.5-i386

Trong đó:

vagrant: đây là cú pháp bắt buộc phải gõ khi muốn dùng ứng dụng vagrant.box: thành phần cần tương tác trên Vagrant, ở đây chúng ta cần tương tác với box.add: hành động cần tương tác với thành phần box.chef/centos-6.5-i386: tên box cần nạp trong địa chỉ https://vagrantcloud.com/discover/featured.

Sau khi Enter, nó sẽ hỏi bạn cần nạp box cho ứng dụng nào, nếu dùng VirtualBox thì gõ số 1 và Enter. Sau đó là nó sẽ tiến hành tải box bạn cần nạp về:

vagrant-add-box

Sau khi add box xong, hãy gõ lệnh vagrant box list để xem danh sách các box hiện đang có trên máy của mình và quan trọng là để xem tên từng box.

vagrant-box-list

Vậy là xong bước nạp box nhé.

Để tạo máy ảo mới, bạn cần tạo một thư mục riêng cho nó, bạn có thể gõ lệnh dưới để tạo thư mục tên là vm1:

mkdir vm1

Thư mục được tạo ra mặc định sẽ nằm ở C:\Users\Tên-User\.

Tạo xong, hãy truy cập vào thư mục đó với lệnh cd:

cd vm1

Bạn gõ thể gõ lệnh pwd để xem đường dẫn thư mục mà bạn đang truy cập.

Sau khi truy cập vào thư mục cần chứa máy ảo mới, bạn gõ lệnh sau để cài đặt một máy ảo mới với box cần sử dụng, ở đây mình cần sử dụng box centos65 mà mình vừa nạp ở trên:

vagrant init centos65

Đợi một xíu nó sẽ có thông báo đã nạp file Vagrantfile vào thư mục này như sau:

vagrant-init-finish

Dòng thông báo nghĩa là nó đã đặt file Vagrantfile vào thư mục máy ảo của bạn rồi, hãy mở nó lên để thiết lập lại và sử dụng lệnh vagrant up để khởi động máy ảo. Khoan hãy khởi động, nếu bạn cần tạo máy ảo để làm máy chủ webserver thì hãy vào thư mục vm1 vừa tạo ở trên và mở file Vagrantfile ra để sửa lại một số cấu hình cần thiết.

Đây là nội dung Vagrantfile của box centos65 của mình, file này có thể sẽ khác tùy theo box.

# -*- mode: ruby -*-# vi: set ft=ruby :# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!VAGRANTFILE_API_VERSION = "2"Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # All Vagrant configuration is done here. The most common configuration # options are documented and commented below. For a complete reference, # please see the online documentation at vagrantup.com.# Every Vagrant virtual environment requires a box to build off of. config.vm.box = "centos65"# Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs # `vagrant box outdated`. This is not recommended. # config.vm.box_check_update = false# Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # config.vm.network "forwarded_port", guest: 80, host: 8080# Create a private network, which allows host-only access to the machine # using a specific IP. # config.vm.network "private_network", ip: "192.168.33.10"# Create a public network, which generally matched to bridged network. # Bridged networks make the machine appear as another physical device on # your network. # config.vm.network "public_network"# If true, then any SSH connections made will enable agent forwarding. # Default value: false # config.ssh.forward_agent = true# Share an additional folder to the guest VM. The first argument is # the path on the host to the actual folder. The second argument is # the path on the guest to mount the folder. And the optional third # argument is a set of non-required options. # config.vm.synced_folder "../data", "/vagrant_data"# Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # # config.vm.provider "virtualbox" do |vb| # # Don't boot with headless mode # vb.gui = true # # # Use VBoxManage to customize the VM. For example to change memory: # vb.customize ["modifyvm", :id, "--memory", "1024"] # end # # View the documentation for the provider you're using for more # information on available options.# Enable provisioning with CFEngine. CFEngine Community packages are # automatically installed. For example, configure the host as a # policy server and optionally a policy file to run: # # config.vm.provision "cfengine" do |cf| # cf.am_policy_hub = true # # cf.run_file = "motd.cf" # end # # You can also configure and bootstrap a client to an existing # policy server: # # config.vm.provision "cfengine" do |cf| # cf.policy_server_address = "10.0.2.15" # end# Enable provisioning with Puppet stand alone. Puppet manifests # are contained in a directory path relative to this Vagrantfile. # You will need to create the manifests directory and a manifest in # the file default.pp in the manifests_path directory. # # config.vm.provision "puppet" do |puppet| # puppet.manifests_path = "manifests" # puppet.manifest_file = "default.pp" # end# Enable provisioning with chef solo, specifying a cookbooks path, roles # path, and data_bags path (all relative to this Vagrantfile), and adding # some recipes and/or roles. # # config.vm.provision "chef_solo" do |chef| # chef.cookbooks_path = "../my-recipes/cookbooks" # chef.roles_path = "../my-recipes/roles" # chef.data_bags_path = "../my-recipes/data_bags" # chef.add_recipe "mysql" # chef.add_role "web" # # # You may also specify custom JSON attributes: # chef.json = { mysql_password: "foo" } # end# Enable provisioning with chef server, specifying the chef server URL, # and the path to the validation key (relative to this Vagrantfile). # # The Opscode Platform uses HTTPS. Substitute your organization for # ORGNAME in the URL and validation key. # # If you have your own Chef Server, use the appropriate URL, which may be # HTTP instead of HTTPS depending on your configuration. Also change the # validation key to validation.pem. # # config.vm.provision "chef_client" do |chef| # chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME" # chef.validation_key_path = "ORGNAME-validator.pem" # end # # If you're using the Opscode platform, your validator client is # ORGNAME-validator, replacing ORGNAME with your organization name. # # If you have your own Chef Server, the default validation client name is # chef-validator, unless you changed the configuration. # # chef.validation_client_name = "ORGNAME-validator"end

Nội dung trong đây là tất cả những thiết lập mà bạn sẽ cần sử dụng nếu cần thiết. Các thiết lập đã được ghi mẫu sẵn mà bạn chỉ cần bỏ comment (xóa dấu # ở đầu) thì có thể sử dụng hoặc copy lại. Nếu bạn muốn thiết lập máy ảo cho việc cài webserver thì nên thiết lập như sau:

Tìm:

# config.vm.network "forwarded_port", guest: 80, host: 8080

Và bỏ dấu # ở trước nó đi.

Đoạn trên có nghĩa là chúng ta sẽ forward các truy cập từ port 8080 vào port 80 trên máy chủ. Thế nhưng cái port forward này chỉ áp dụng cho các máy tính ở ngoài mạng nội bộ, do vậy nếu bạn muốn truy cập vào website trên mạng nội bộ thì vẫn phải gõ đường dẫn là http://127.0.0.1:8080 hoặc http://localhost:8080.

Tạm thời như vậy là xong, bây giờ hãy mở Git Bash lên và truy cập vào thư mục vm1 nếu bạn chưa truy cập. Sau đó khởi động máy ảo bằng lệnh sau:

vagrant up

vagrant-up-finish

Và cuối cùng là gõ lệnh vagrant ssh để truy cập vào máy ảo vừa khởi động qua giao thức SSH. Khởi động xong, hãy thử mở VirtualBox lên và bạn sẽ thấy đã có một máy ảo đang được chạy.

virtualbox-vagrantup

Hãy lưu ý rằng, bạn có thể tạo ra nhiều máy chủ nhưng mỗi máy chủ phải ở riêng một thư mục khác nhau. Khi truy cập vào thư mục nào, thì các lệnh ở trên sẽ tương tác với máy ảo ở thư mục đó.

Trong khi dùng Vagrant, có thể bạn sẽ sử dụng rất nhiều một số lệnh dưới đây nên tốt nhất là hãy nhớ chức năng của nó:

vagrant box add – Nạp box.vagrant box list – Xem danh sách các box.vagrant suspend – Cho máy ảo tạm nghỉ.vagrant halt – Cho máy ảo đi ngủ, shutdown đó.vagrant destroy – Cho máy ảo về vườn.vagrant login – Đăng nhập vào hệ thống Vagrant Cloud.vagrant share --ssh: Chia sẻ máy ảo của bạn cho người khác truy cập, bạn phải gõ lệnh vagrant login trước khi dùng tính năng này.vagrant reload: Tải lại các thiết lập trong file Vagrantfile của máy ảo, khi đổi nội dung file đó bạn phải sử dụng lệnh vagrant halt trước để tắt máy ảo, sau đó sử dụng lệnh reload này để nạp lại cấu hình.

Mặc định khi truy cập vào SSH thông qua lệnh vagrant ssh, bạn sẽ truy cập vào máy ảo thông qua user vagrant và user này sẽ không có quyền root. Do đó mỗi lần gõ lệnh cài hay thay đổi thiết lập gì bạn bắt buộc phải thêm sudo đằng trước lệnh. Tuy nhiên, bạn không thể sử dụng sFTP để truy cập được và sửa các file cấu hình vì không có quyền root.

Để truy cập SSH với quyền root. Bạn sử dụng các phần mềm khác như PuTTY để truy cập vào máy chủ trên máy của bạn với thông tin là:

IP: 127.0.0.1Username: rootPassword: vagrantPort: 2222

Hoặc bạn có thể vào SSH bằng lệnh vagrant ssh, sau đó gõ su để chuyển qua user root.

Lưu ý: Mỗi box có thể có thiết lập khác nhau, mà thiết lập này nó đều hiển thị ra khi bạn tiến hành gõ xong lệnh vagrant up. Ngoại trừ pass root, theo thử nghiệm của mình thì đa phần các box không kèm theo ứng dụng đều có pass root là vagrant.

Nếu bạn có cài LAMP hay LEMP thì khi muốn truy cập vào website, bạn phải sử dụng đường dẫn là http://127.0.0.1:8080 vì Vagrant chỉ hỗ trợ bạn listen cổng 8080 trỏ về cổng 80 chứ không listen trực tiếp.

Nếu bạn gặp lỗi timeout khi kết nối vào máy chủ qua SSH bằng lệnh vagrant ssh, sẽ có 2 lý do phổ biến như sau:

Bạn đang dùng máy ảo để cài Vagrant, tài nguyên bị thiếu.Dùng hệ điều hành không tương thích với phần cứng. Ví dụ bạn có máy ảo chỉ vài trăm MB RAM mà lại dùng bản 64bit.

Khi cài LAMP hay LEMP, bạn cứ thêm domain bằng virtualhost như thường lệ. Sau đó mở file hosts trên máy tính và trỏ domain đã add về IP 127.0.0.1. Ví dụ:

thachpham.dev 127.0.0.1

Trong một vài trường hợp, bạn sẽ cần di chuyển qua lại các dữ liệu giữa máy tính của bạn với máy ảo, lúc đó tính năng Synced Folder sẽ phát huy tác dụng của nó. Bây giờ bạn hãy thử vào thư mục vm1 mà bạn đã tạo để chứa máy ảo và tạo một file bất kỳ trong đó.

Sau đó vào SSH, gõ lệnh ls /vagrant thì bạn sẽ thấy file của bạn đã có ở đó. Ngược lại nếu bạn vào máy ảo, đặt cái gì vào thư mục này thì thư mục vm1 trên máy tính cũng sẽ có.

Như vậy bạn có thể hiểu, mặc định bất cứ cái gì bạn bỏ vào thư mục vm1 trên máy tính sẽ đều đưa vào thư mục /vagrant của máy ảo. Nếu bạn có nhu cầu đổi thư mục đồng bộ này, bạn có thể mở file Vagrantfile ra và tìm:

# config.vm.synced_folder "../data", "/vagrant_data"

Trong đó, ../data nghĩa là thư mục trên máy tính của bạn và /vagrant_data là thư mục trên máy ảo. Bạn có thể thử bằng cách tạo thêm một thư mục tên data trong thư mục vm1, sau đó sửa đoạn trên thành:

config.vm.synced_folder "data/", "/vagrant"

Và bây giờ hãy thử đặt một file nào đó trong thư mục data/ rồi vào máy ảo xem kết quả.

Tính năng này rất hay và hữu dụng nếu bạn muốn truy cập vào máy ảo trên một máy tính khác ở ngoài mạng hoặc cho bạn bè xem website mà không cần thiết lập mạng máy tính để tránh các vấn đề rủi ro bảo mật. Tính năng này nó sẽ sử dụng máy chủ vagrantcloud.com làm máy chủ trung gian và mỗi lần bạn chia sẻ, nó sẽ cung cấp cho bạn một cái tên ngẫu nhiên kiểu http://random-number.vagrantcloud.com và địa chỉ này sẽ bị hủy nếu bạn tắt cửa sổ lệnh hoặc ấn Ctrl + C ở cửa sổ gõ lệnh (ở đây là Git Bash).

Để sử dụng tính năng này, trước tiên bạn cần phải đăng ký một tài khoản tại https://vagrantcloud.com, hoàn toàn miễn phí nhé.

Sau đó mở Git Bash lên và gõ vagrant login để đăng nhập vào Vagrant Cloud.

vagrant-login

Ok, chẳng hạn bây giờ mình muốn người khác vào SSH trên máy ảo của mình thì sẽ cần gõ lệnh như sau:

vagrant share --ssh

Nó sẽ hỏi bạn thiết lập passpharse cho máy này, giống như kiểu password vậy đó, bạn hãy nhập mật khẩu tùy thích và nhớ là người đăng nhập phải biết mật khẩu này.

vagrant-share-ssh

Và sau đó là nó sẽ cho bạn địa chỉ và cái tên của máy ảo để người khác kết nối. Nhưng đối với SSH, người cần kết nối chỉ có thể kết nối nếu họ đã cài đặt Vagrant trên máy. Còn nếu máy ảo của bạn đã có cài đặt webserver thì có thể truy cập vào website thông qua địa chỉ nó cung cấp mà không cần nhập port :8080 vì nó đã tự forward từ 80 sang 8080.

vagrant-share-ssh-finish

Khi chia sẻ, bạn sẽ nhận được một đường dẫn máy ảo ví dụ như http://sizzling-yak-5509.vagrantshare.com/, như vậy máy ảo của bạn sẽ có tên là sizzling-yak-5509 và chúng ta sẽ kết nối vào SSH trên máy ảo này với lệnh:

vagrant connect sizzling-yak-5509

Với lệnh vagrant share –ssh ở trên, bạn chỉ có thể chia sẻ máy ảo thông qua giao thức  SSH với cổng là 2222 mà thôi chứ không thể vào web với cổng HTTP được. Do vậy, nếu bạn muốn chia sẻ toàn bộ các cổng hiện có trên máy chủ thì có thể xóa tham số –ssh đi.

vagrant share

Lưu ý với kiểu share này, bạn phải cài đặt webserver trước và khởi động nó lên.

Tới đây thì bài cũng đã khá dài rồi và những gì mình đã trình bày trong bài này đã đủ giúp bạn xây dựng một máy ảo trên máy tính của mình để bạn có thể thực hành Học VPS căn bản để chạy website WordPress trên môi trường máy chủ. Ở bài kế tiếp, mình sẽ hướng dẫn bạn cách tự tạo box cho riêng mình để tái sử dụng mà không cần cài đặt lại và chia sẻ box đó lên thư viện của VagrantCloud để cho bạn bè cùng sử dụng.

Nếu có gì trục trặc, hãy cho mình biết rõ bạn đang gặp lỗi gì để mình có thể trợ giúp.


This post was made using the Auto Blogging Software from WebMagnates.org This line will not appear when posts are made after activating the software to full version.

Chủ Nhật, 23 tháng 11, 2014

Tự code có tối ưu hơn là dùng plugin?

Từ lúc mình tham gia vào cộng đồng WordPress cho đến nay đã phải nghe rất nhiều người nói rằng dùng nhiều plugin quá không tốt, tự code được cái nào thì hay cái nấy để tránh website thêm rề rà. Đây là tâm lý chung của hầu hết người sử dụng WordPress, nhất là những người sử dụng phổ thông. Phải, dùng nhiều plugin sẽ khiến website của bạn chậm đi nhiều hay ít tùy thuộc vào số lượng plugin đang dùng, và loại plugin đang dùng vì có rất nhiều loại plugin làm website trở nên chậm chạp.

Thế nhưng theo suy nghĩ và phân tích của mình, tự code hoặc lấy code của người khác bỏ vào website chưa chắc đã tối ưu hơn sử dụng plugin, tại sao thì trong bài này mình sẽ phân tích rõ ràng và dễ hiểu nhất cho các bạn thấy.

Plugin (dịch ra tiếng Việt là trình cắm?!) là một phương thức để WordPress được mở rộng chức năng ra mà bản thân nó không có sẵn, ví dụ plugin bán hàng WooCommerce. Vậy bạn nghĩ plugin tạo ra từ cái gì? Tất nhiên plugin được tạo ra từ code PHP được viết trong đó và nếu bạn nào đã từng sửa theme nhiều thì sẽ biết, nó hoạt động gần như giống file functions.php trong mỗi theme, nghĩa là một khi plugin kích hoạt thì các code ở bên trong plugin sẽ được tải mỗi khi khách truy cập truy cập đúng nơi mà nó cần tải.

Về phương thức hoạt động, mình xin khẳng định là không vì nó chỉ đơn giản là thực thi các đoạn mã PHP mà thôi. Nếu bạn đặt một code trong file functions.php của themes và đặt một code nằm bên trong một plugin thì rõ ràng nó vẫn như nhau.

Tuy nhiên, nó sẽ có hai điểm khác nhau rõ ràng nhất đó là phải được bắt buộc khai báo thông tin plugin trong một file PHP như thế này:

/*Plugin Name: Test PluginPlugin Author: ThachPhamDescription: Ví dụ về một plugin WordPressVersion: 1.0*/

Đồng thời, trong table wp_options, ở key option_name với cột active_plugins sẽ xuất hiện thêm một string trong giá trị của nó để khai báo các plugin đang được kích hoạt như thế này:

a:31:{i:0;s:13:"AddMySite.php";i:1;s:19:"akismet/akismet.php";i:2;s:23:"all_in_one_seo_pack.php";i:3;s:16:"authenticate.php";i:4;s:28:"breadcrumb-navigation-xt.php";i:5;s:18:"codeautoescape.php";i:6;s:37:"contact-coldform/contact_coldform.php";i:7;s:32:"custom-query-string-reloaded.php";i:8;s:30:"customizable-post-listings.php";i:9;s:33:"dd-sitemap-gen/dd-sitemap-gen.php";i:10;s:20:"download-counter.php";i:11;s:13:"feedcount.php";i:12;s:13:"full_feed.php";i:13;s:15:"get-weather.php";i:14;s:36:"google-sitemap-generator/sitemap.php";i:15;s:13:"gravatars.php";i:16;s:19:"kill-admin-nags.php";i:17;s:18:"landingsites13.php";i:18;s:30:"nofollow-free/nofollowfree.php";i:19;s:17:"ol_feedburner.php";i:20;s:16:"plugins-used.php";i:21;s:22:"popularity-contest.php";i:22;s:39:"search-everything/search_everything.php";i:23;s:27:"simple-tags/simple-tags.php";i:24;s:26:"simple_recent_comments.php";i:25;s:18:"simple_twitter.php";i:26;s:25:"subscribe-to-comments.php";i:27;s:24:"the-excerpt-reloaded.php";i:28;s:18:"theme-switcher.php";i:29;s:9:"top10.php";i:30;s:16:"wp-db-backup.php";}

Và những plugin có sử dụng các options cho phép chúng ta tùy chỉnh thì dữ liệu của nó cũng sẽ được lưu vào database ở table wp_options, nhưng nó sẽ không mất đi khi tắt plugin mà chỉ mất đi nếu ta xóa thủ công hoặc plugin đó có chức năng xóa dữ liệu trong database khi tắt đi.

Như vậy ở phần này, bạn tạm hiểu rằng cách hoạt động của plugin và code tự thêm vào file functions.php là như nhau, tuy nhiên khi dùng plugin thì nó sẽ thêm một string dữ liệu vào database để khai báo và càng sử dụng nhiều plugin thì dữ liệu này càng nhiều và qua thời gian dài nếu không được chăm sóc kỹ sẽ gây nặng database.

Theo nhã kiến của mình, việc sử dụng code để thêm vào file functions.php trong theme để làm các tính năng mình muốn cũng tốt vì hạn chế dùng plugin sẽ tránh được chuyện nặng database mà mình đã nói ở trên. Nhưng cũng theo mình, việc sử dụng code tự thêm vào chỉ thật sự tốt nếu bạn tin chắc rằng code đó tối ưu, hiểu nó có ý nghĩa gì hoặc chỉ thích hợp làm các tính năng nhỏ. Còn đối với một số tính năng quan trọng, nhất là tính năng có sử dụng đến query như tạo bài liên quan, bài ngẫu nhiên,…thì tốt nhất nên dùng các plugin uy tín như Yet Another Related Posts chẳng hạn.

Bởi vì các plugin đó đã được tác giả phát triển và tối ưu theo thời gian, có thể khai thác nhiều tính năng quan trọng trong WordPress hơn để hạn chế xảy ra bug và nếu các plugin này làm việc liên quan đến Query thì rất có thể họ sẽ viết code phù hợp với Transient API để giảm thiểu khả năng bị tràn bộ nhớ do liên tục xử lý query trong database.

Về bảo mật, các plugin uy tín sẽ luôn được tác giả cập nhật thường xuyên nên nếu nó có lỗi bảo mật gì thì cũng sẽ được vá lỗi nhanh chóng, lại còn được tác giả hỗ trợ kỹ thuật qua phần Support của mỗi plugin nữa.

Tóm tắt lại bài, mình xin kết luận như sau để bạn có thể hiểu rõ.

Khi mà bạn cần triển khai  các tính năng phức tạp nhưng đã có plugin hỗ trợ sẵn, dĩ nhiên các plugin đó phải hỗ trợ phiên bản WordPress mà bạn đang dùng và được cập nhật thường xuyên thì lại càng tốt.

Khi mà bạn thật sự hiểu code đó làm gì và chắc chắn rằng nó được tối ưu với máy chủ hơn vì code có tối ưu hay không là do người viết, hãy chắc chắn rằng code đó bạn có thể sửa lại như ý muốn và dễ phát triển sau này chứ không hẳn là chỉ copy/paste.

Nếu bạn đã từng cài nhiều plugin rồi và cảm thấy dung lượng database của mình đã khá nặng, hãy sử dụng plugin WP Options Editor để xóa những table, những key không cần thiết của các plugin cũ trong database và mình khuyên khi vừa không còn sử dụng plugin nào nữa, hãy xóa ngay vì sau này nếu bạn đã từng cài qua nhiều plugin thì sẽ rất vất vả để xóa nó.

Hy vọng với bài ngắn này sẽ có thể giải đáp về câu hỏi khiến nhiều người hoang mang và yên tâm hơn trong việc dùng plugin của mình.


This post was made using the Auto Blogging Software from WebMagnates.org This line will not appear when posts are made after activating the software to full version.

Thứ Tư, 5 tháng 11, 2014

WPNode – Host miễn phí cho WordPress sử dụng NGINX

Mới đây, mình vừa tìm ra một dự án host dành riêng cho website sử dụng WordPress với các cấu hình rất tốt và tốc độ rất nhanh mang tên WPNode. WPNode sử dụng webserver là NGINX, có cài đặt thêm Roundcube, Memcached để hỗ trợ tăng tốc website. Điều đặc biệt hơn là gói miễn phí vĩnh viễn của WPNode không có bất cứ yêu cầu nào như treo quảng cáo này nọ. Dĩ nhiên đã sử dụng NGINX và cấu hình tối ưu thì nó không hỗ trợ control panel như cPanelX hay DirectAdmin mà bạn chỉ thao tác qua sFTP và phpMyAdmin.

Chỉ nên đăng ký nếu bạn thật sự cần host miễn phí, đừng làm họ phải đưa Việt Nam vào blacklist.

Webserver NGINXMySQL ServerChạy trên hệ điều hành Ubuntu vì nó sử dụng EasyEngine script vốn dành cho Ubuntu. Mình sẽ có hướng dẫn bạn sử dụng script này sau.Hỗ trợ 5GB dung lượng1GB dung lượng EmailKhông giới hạn băng thôngKhông giới hạn website sử dụngCài đặt sẵn W3 Total Cache và cấu hình tối ưu

Lưu ý:

Không có control panel hoặc bất cứ giao diện UI nàoKhông có SSH

Nhìn chung, với một website nhỏ và vừa thì thông số trên đủ để chạy rồi, thậm chí còn dư. Tuy nhiên mình cũng khuyến khích thêm rằng với các dự án thế này, bạn chỉ nên sử dụng cho các website nhỏ hoặc ít nhất là không phải website chính của bạn.

WPNode không hỗ trợ đăng ký tự động nên nếu bạn muốn sử dụng, bạn sẽ đăng ký bằng cách gửi yêu cầu đến họ, dĩ nhiên là gửi bằng tiếng Anh. Ở nội dung email, bạn sẽ cần nêu ra lý do sử dụng, domain cần sử dụng, tên username cần đặt và một số yêu cầu khác nếu cần (máy chủ).

Để đăng ký, bạn cần truy cập vào http://wpnode.net/apply/ rồi nhập tên, email và nội dung yêu cầu. Hãy nhớ trình bày lý do mà bạn cần sử dụng nhé và nhớ đọc nội dung bên tay trái để biết bạn cần viết gì vào nội dung.

apply-wpnode

Sau đó hãy kiên nhẫn đợi khoảng vài giờ, họ sẽ gửi một email thông báo thông tin tài khoản của bạn (đã được cài đặt sẵn WordPress) hoặc có thể là từ chối. Mình nhận được email trả lời chấp thuận trong vòng khoảng 30 phút.

wpnode-approved

Mới đây WPNode đã bị các người dùng tại Việt Nam sử dụng host của họ làm web spam. Họ đang thắt chặt đăng ký lại nên hãy trình bày rõ lý do bằng cách trả lời lại email của họ.

wpnode-spam

Và rồi, việc bây giờ của bạn chỉ là sử dụng nó thôi.

Và đây là tốc độ website của mình trên WPNode, không tệ phải không nào, máy chủ của nó là NewYork.

wpnode-speed