Trong lúc đọc bài hướng dẫn tại WordPress
Documents, bạn có thể sẽ thấy mình thường hay nói là “hãy đặt đoạn này
vào bên trong loop”. Nhiều bạn mới tìm hiểu có thể chưa hiểu lắm về Loop
nên ở bài này mình xin giải thích cặn kẽ kèm theo video minh hoạ về
khái niệm WordPress Loop.
Loop là gì?
Ai học qua lập trình thì đều hiểu rằng Loop là một hành động được lặp đi lặp lại thông qua một số hàm nhưwhile
, for
, foreach
,…Và
ở trong WordPress cũng thế thôi, Loop trong WordPress là một đoạn code
được đặt trong một hàm while (đa phần là vậy) các query bên trong biến
toàn cục $wp_query
để lấy giá trị của một post trong post type nào đó.Những đoạn code đặt bên trong một Loop thì người ta gọi là Template Tags, các hàm này có ý nghĩa hiển thị những thành phần cụ thể như:
the_title()
: hiển thị tiêu đề của post.the_content()
: hiển thị nội dung của post.the_excerpt()
: hiển thị nội dung excerpt của post, nếu không có excerpt thì nó sẽ tự động cắt một phần nội dung.- …….
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
while ( have_posts() ) : //kiểm tra số lần lặp dựa trên số lượng bài viết được thực thi bởi $wp_query. the_post(); // Kiểm tra loop xem bài đã được loop chưa, nếu rồi thì bỏ qua và loop bài kế. the_title(); //Hiển thị tiêu đề của post, sử dụng get_the_title() để return giá trị của nó. the_content(); //hiển thị nội dung của post. /*--Xem thêm Template Tags: http://codex.wordpress.org/Template_Tags **/ endwhile ; else : //Nếu $wp_query không có nội dung echo "Không có bài nào cả" ; endif ; ?> |
Gợi ý - Miễn phí theme tại ThemeFuse
Ở đoạn code trên mình có nhắc qua WordPress Query, tức là khái niệm mặc định để WordPress gọi dữ liệu từ database để hiển thị ra và lưu trong một biến toàn cục tên là $wp_query, mỗi khi bạn truy cập vào website thì Query này sẽ thực thi. Vì thế nên chúng ta mới sử dụng class WP_Query để tạo một query mới để làm các phần tuỳ chọn như bài liên quan, hiển thị một bài viết từ một taxonomy nào đó ra sidebar, trang chủ,…
Tạo mới query với WP_Query
Đã nói tới Loop thì không bao giờ thiếu query vì hai cái này là vợ chồng với nhau nên đi đâu chúng ta phải lôi tụi nó đi theo chứ không tụi nó nhớ nhau mà không làm việc được.Vậy thì bây giờ nếu chúng ta muốn tuỳ biến bài viết hiển thị ra thì phải tùy biến cái Query trước. Ví dụ như chỉnh sửa số lượng bài viết được lặp, lấy bài từ một term nào đó,…. Và để tuỳ biến, chúng ta sẽ sử dụng class
WP_Query
để tạo ra một Query mới với các tham số như ý của mình.Để tạo một Query mới, chúng ta sẽ tạo một biến và kế thừa class
WP_Query
như sau:$new_query = new WP_Query( $args );
Cái
$args
là tham số của class này (xem documentation)
và bạn có thể thiết lập nó lại để lấy dữ liệu theo ý muốn. Ví dụ mình
muốn cho cái Loop sẽ hiển thị 3 bài thôi thì có tham số là 'posts_per_page' => 3
. Đầy đủ sẽ là:$new_query = new WP_Query( 'posts_per_page' => 3 );
Hoặc nếu bạn dùng quá nhiều tham số thì có thể cho vào một biến. Ví dụ:
1
2
3
4
5
| $args = array ( 'posts_per_page' => 3, 'post_type' => 'page' , 'orderby' => 'rand' ); |
Sau khi đã có query mới (mà như ví dụ là
$new_query
) thì chúng ta sẽ viết nó vào loop như sau:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
while ( $new_query ->have_posts() ) : //kiểm tra số lần lặp dựa trên số lượng bài viết được thực thi bởi $wp_query. $new_query ->the_post(); // Gọi hàm này để sử dụng những Template Tags. the_title(); //Hiển thị tiêu đề của post, sử dụng get_the_title() để return giá trị của nó. the_content(); //hiển thị nội dung của post. /*--Xem thêm Template Tags: http://codex.wordpress.org/Template_Tags **/ endwhile ; else : //Nếu $wp_query không có nội dung echo "Không có bài nào cả" ; endif ; ?> |
$new_query
đã được truyền vào đối tượng have_posts()
để nó kiểm tra, sau đó là nó cũng được áp dụng vào đối tượng the_post()
để kiểm tra xem post này đã được lặp chưa, nếu rồi thì nó sẽ bỏ qua và lặp bài tiếp theo.Ngoài ra trong WordPress còn có một hàm để lấy dữ liệu của post tên là
get_posts()
nhưng nó không hay bằng WP_Query
và dễ bị xung đột với các query khác nếu bạn quên hàm wp_reset_query()
để reset query này vì nó chỉ có nhiệm vụ lấy dữ liệu ở biến $wp_query
mặc định và trả về với kiểu Array, dĩ nhiên đồng hành với nó là phải sử dụng foreach
để tạo loop.Còn
WP_Query
là bạn tạo mới một query và có thể sử dụng ở
bất cứ khu vực nào. Bạn cũng có thể tạo query ở một file khác rồi chỉ
cần gọi ra khi cần sử dụng, cũng không cần clear query.Tuỳ biến query hiện có với query_posts
Như các bạn đã biết là khi tạo một Query mới, thì mỗi khi viết loop ta phải cho biến query đó áp dụng vào đối tượnghave_posts()
và the_post()
. Nhưng bây giờ bạn muốn trực tiếp sửa một query luôn mà không cần sửa lại loop thì sao? Đó là sử dụng query_posts()
.Hàm này sẽ trực tiếp thay đổi các giá trị bên trong biến $wp_query mặc định, có nghĩa là nếu bạn không reset query dưới mỗi loop thì các query ở những trang khác cũng sẽ bị thay đổi.
Mình có ví dụ như sau để sửa lại toàn bộ query bên trong một trang, chỉ cần đặt nó vào file functions.php
1
| query_posts( 'posts_per_page=1' ); |
query_posts()
. Hoặc ta cũng có thể làm cho nó linh hoạt hơn như chỉ thực hiện ở trang chủ.
1
2
3
| if ( is_home() ) { query_posts( 'posts_per_page=1' ); } |
query_posts()
bên trên một loop và nhớ thêm wp_reset_query()
ở ngay sau endwhile
.Dễ hiểu đúng không nào
Tóm tắt bài
Trong bài này ta đã tìm hiểu qua khái niệm Query và Loop trong WordPress. Query có nhiệm vụ lấy dữ liệu từ bên trong database và Loop sẽ tiến hành lặp đi lặp lại cái Query và truyền dữ liệu vào đối tượng the_post() để hiển thị thông tin bài viết với Template Tags.- Nếu muốn tạo Query mới, dùng class
WP_Query
. - Nếu muốn sửa Query mặc định, dùng
query_posts
. - Hàm
get_posts()
sẽ trả về thông tin bài viết với giá trị kiểu Array, vì thế phải dùng foreach để loop. Nói chung cái này nên hạn chế dùng.