Advertisement
  1. Code
  2. Coding Fundamentals
  3. Rest API

Làm chủ WP_Query: Các Hàm Liên quan

Scroll to top
Read Time: 10 min
This post is part of a series called Mastering WP_Query.
Mastering WP_Query: Using the Loop
Mastering WP_Query: Actions and Filters

() translation by (you can also view the original English article)

Xin chào, và mừng bạn đến với phần thứ hai của loạt bài "Làm chủ WP_Query". Trong phần đầu tiên, chúng ta bắt đầu loạt bài này bằng cách đơn giản là giới thiệu về lớp WP_Query là gì. Và trong phần thứ hai này, chúng ta sẽ tìm hiểu về các hàm liên quan đến WP_Query.

Hãy bắt đầu nào!

Khai thác Sức mạnh của WP_Query Với các Hàm, Action và Filter

Tôi không giỏi về lập trình, nhưng tôi có thể thấy rằng lớp WP_Query là một trong những ví dụ điển hình nhất về mẫu MVC. Nó cực kỳ mạnh mẽ, hoàn toàn có thể mở rộng, và rất dễ sử dụng một khi bạn đã nắm được những điều cơ bản.

Ngoài các thuộc tính, phương thức và các tham số của nó (những cái mà chúng ta sẽ tìm hiểu sau đây), WordPress còn cung cấp các hàm và các hook phụ (có nghĩa là các action và filter) để làm việc với lớp WP_Query. Trong bài hướng dẫn này, chúng ta sẽ đi tìm hiểu về các hàm và trong phần tiếp theo, chúng ta sẽ khám phá các action và filter có liên quan đến WP_Query. Nếu bạn nhận thấy tôi đã bỏ sót điều gì đó, xin hãy nói cho tôi biết bằng cách bình luận.

Các Hàm liên quan đến WP_Query

Có 13 hàm WordPress làm việc với lớp WP_Query có thể giúp bạn khai thác sức mạnh của WP_Query. Không cần phải giới thiệu về chúng, chúng ta đi thẳng vào từng hàm:

Lấy các biến truy vấn công khai: get_query_var()

Tên của hàm đầu tiên tự nói lên ý nghĩa của nó, thật vậy: Nó lấy đối tượng $wp_query toàn cục và lấy ra một biến truy vấn công khai từ nó. Nó có hai tham số: đầu tiên là biến trả về giá trị của nó, và cái thứ hai là giá trị mặc định để trả về nếu biến không được thiết lập:

1
<?php
2
3
$paged = get_query_var( 'paged', 1 );
4
5
?>

Tác động lên vòng lặp chính: query_posts()

Nói thật, đây là một hàm dở. Bạn thật sự không cần thiết phải sử dụng đến nó, nhưng để cho "đúng cách", chúng ta sẽ khái quát nó và nói với bạn rằng đó là "cách sai".

query_posts() là một hàm dùng để thay đổi truy vấn chính bằng cách đặt truy vấn chính sang một bên và chạy một truy vấn mới - và bạn sẽ cần phải sử dụng wp_reset_query() để dọn dẹp sau đó.

1
<?php
2
3
query_posts( 'category_name=news' );
4
5
?>

Hàm này là một trong những hàm bị dùng sai nhiều nhất trong nhân của WordPress. Bạn không nên sử dụng nó để tạo các truy vấn thứ cấp - bạn có thể sử dụng lớp WP_Query hoặc hàm get_posts() (hàm mà chúng ta sẽ nói đến trong phần sau của hướng dẫn này). Bạn cũng không nên sử dụng nó để thay đổi truy vấn chính - bạn nên sử dụng action pre_get_posts (cái mà chúng ta cũng sẽ nói đến sau này). Ngay cả Codex cũng không khuyến khích chúng ta sử dụng nó và đưa ra các lựa chọn thay thế.

Tóm lại: Đừng sử dụng nó.

Truy vấn một bài viết đơn lẻ: get_post()

Một một hàm dễ nhận ra khác là get_post(), hàm mà bạn sử dụng để lấy về một bài viết. Nó có ba tham số tùy chọn:

  • Đầu tiên là ID của bài viết (hoặc mặc định ID của bài viết hiện tại).
  • Cái thứ hai là kiểu kết quả mà bạn sẽ nhận được: OBJECT, ARRAY_A (một mảng kết hợp) hoặc ARRAY_N (một mảng số).
  • Thứ ba là sự lựa chọn cho việc lọc kết quả. Mặc định là 'raw' vì vậy nó sẽ không được lọc trừ khi bạn thiết lập nó thành 'edit', 'display', 'attribute' hoặc 'js'.
1
<?php
2
3
$first_post = get_post( 1, ARRAY_A );
4
$post_title = $first_post[ 'post_title' ];
5
6
?>

Lưu các truy vấn vào mảng: get_posts()

Hàm get_posts() cho phép chúng ta chạy các truy vấn và lưu chúng dưới dạng các mảng để sử dụng ở những nơi khác nhau. Nó yêu cầu các đối số tương tự với WP_Query vì vậy bạn có thể tuỳ biến truy vấn theo ý muốn. (Chúng ta sẽ xem lại các tham số của WP_Query sau này, vì vậy hãy nhớ theo dõi!) Đó là cách tốt nhất và hiệu quả nhất để tạo danh sách các bài viết - nhưng không phải là các vòng lặp.

1
<?php
2
3
$args = array(
4
    'category_name' => 'news',
5
    'order' => 'ASC',
6
    'orderby' => 'post_title',
7
    'posts_per_page' => -1
8
);
9
10
// Return an array of all posts in the "news" category.

11
$all_posts_list = get_posts( $args );
12
13
?>

Mặc dù hàm này có thể được sử dụng để chạy "các truy vấn thứ cấp" mà không gặp vấn đề gì, Codex khuyến khích sử dụng WP_Query khi tạo nhiều vòng lặp và sử dụng get_posts() khi lấy ra một danh sách bài viết. Peter R. Knight giải thích sự khác biệt giữa get_posts()WP_Query bằng các thuật ngữ đơn giản: sự khác biệt chính đó là WP_Query tạo ra nhiều hơn các truy vấn cơ sở dữ liệu (dữ liệu bài viết, metadata, dữ liệu tác giả và dữ liệu bình luận) trong khi get_posts() chỉ thực hiện một truy vấn (dữ liệu bài viết).

Truy vấn các Trang: get_pages()

Hàm kỳ lạ này có mục đích là lấy về một danh sách của các trang, tuy vậy nó có một tham số post_type có thể cho phép bạn chọn một loại bài viết khác (với điều kiện loại bài viết là có thứ bậc, nếu không nó sẽ trả về false).

1
<?php
2
3
$args = array(
4
    'sort_order' => 'ASC',
5
    'sort_column' => 'post_title',
6
    'hierarchical' => 1,
7
    'exclude' => '',
8
    'include' => '',
9
    'meta_key' => '',
10
    'meta_value' => '',
11
    'authors' => '',
12
    'child_of' => 0,
13
    'parent' => -1,
14
    'exclude_tree' => '',
15
    'number' => '',
16
    'offset' => 0,
17
    'post_type' => 'page',
18
    'post_status' => 'publish'
19
);
20
21
$pages = get_pages( $args );
22
23
?>

Nó chấp nhận các đối số rất giống với đối số của WP_Query, nhưng chúng hơi khác một chút:

  • sort_order: sắp xếp các trang theo thứ tự tăng dần (asc) hay giảm dần (desc).
  • sort_column: cách sắp xếp các trang. Chấp nhận post_title, menu_order, post_date, post_modified, ID, post_author, và post_name.
  • hierarchical: liệt kê các trang theo thứ bậc (1) hay không (0).
  • exclude: một danh sách được phân tách bằng dấu phẩy hoặc một mảng ID của các trang để loại trừ khỏi danh sách.
  • include: một danh sách được phân tách bằng dấu phẩy hoặc một mảng ID của các trang để đưa vào danh sách và loại trừ mọi thứ khác.
  • meta_key: khi được sử dụng chung với đối số meta_value, nó chỉ bao gồm các trang mà có khóa meta và giá trị được định nghĩa.
  • meta_value: khi được sử dụng với đối số meta_key, nó chỉ bao gồm các trang có khóa meta và giá trị được định nghĩa.
  • authors: một danh sách được phân tách bởi dấu phẩy của các ID của tác giả.
  • child_of: ID của một trang để lấy về chỉ con và cháu của nó trong danh sách.
  • parent: liệt kê các trang có ID trang được cung cấp như là cha. Để cho đối số này hoạt động, đối số hierarchical phải được thiết lập thành 0.
  • exclude_tree: một danh sách được phân tách bằng dấu phẩy hoặc một mảng ID của các trang để loại trừ với con của nó.
  • number: số trang cần lấy ra.
  • offset: số trang cần bỏ qua từ bên trên.
  • post_type: loại bài viết để truy vấn. Đương nhiên, nó mặc định là page.
  • post_status: một danh sách được phân tách bởi dấu phẩy của các loại trạng thái bài viết để bao gồm.

Kiểm tra xem liệu truy vấn có trả về các bài viết hay không: has_posts()

Nếu không nhận bất kỳ tham số nào, thì hàm này chỉ trả về TRUE nếu truy vấn trả về dữ liệu và FALSE nếu không.

1
<?php
2
3
if ( have_posts() ) {
4
    
5
    // Success.

6
    
7
} else {
8
    
9
    // Failure.

10
    
11
}
12
13
?>

Thực hiện công việc cho vòng lặp: the_post()

Codex nói rằng nó "lặp qua chỉ mục của bài viết trong vòng lặp". Nó thực hiện một vài điều:

  1. Nó lấy ra dữ liệu tiếp theo từ truy vấn.
  2. Nó thiết lập dữ liệu $post.
  3. Nó thiết lập tham số in_the_loop thành TRUE.
1
<?php
2
3
if ( have_posts() ) {
4
5
    while ( have_posts() ) {
6
7
        the_post();
8
9
        the_title();
10
11
        the_content();
12
13
    }
14
    
15
}
16
17
?>

Thiết lập $post: setup_postdata()

Hàm này cũng khá dễ hiểu: nó thiết lập dữ liệu bài viết toàn cục. Hãy xem Codex nói về hàm này:

setup_postdata() điền các biến toàn cục $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages, giúp nhiều Template Tag hoạt động trong ngữ cảnh của bài viết hiện tại. Nó không gán biến $post toàn cục, nhưng dường như kỳ vọng rằng đối số của nó là một tham chiếu đến nó.

1
<?php
2
3
global $post;
4
5
setup_postdata( $post );
6
7
?>

Xoá vòng lặp hiện tại: rewind_posts()

Một hàm khác mà tên của nó đã nói lên chức năng của nó: hàm này chỉ đơn giản là "tua lại" vòng lặp để bạn có thể chạy lại sau này.

1
<?php
2
3
// After the loop.

4
rewind_posts();
5
6
?>

Thiết lập lại $post: wp_reset_postdata()

Hàm này thiết lập lại biến $post toàn cục về bài viết đầu tiên trong truy vấn chính. Tốt hơn là nên sử dụng hàm này sau một truy vấn thứ cấp.

1
<?php
2
3
// After a secondary query.

4
wp_reset_postdata();
5
6
?>

Thiết lập lại truy vấn: wp_reset_query()

Hàm này nên được sử dụng nếu truy vấn chính bị thay đổi (với hàm query_posts() hoặc action pre_get_posts mà chúng ta sẽ tìm hiểu trong phần tiếp theo) để truy vấn chính có thể được thiết lập lại.

1
<?php
2
3
// After the main query is altered.

4
wp_reset_query();
5
6
?>

Kiểm tra xem truy vấn hiện tại có phải là truy vấn chính hay không: is_main_query()

Hàm này là một Thẻ Điều kiện trả về TRUE nếu truy vấn hiện tại là truy vấn chính và FALSE nếu không phải. Đơn giản, phải không?

1
<?php
2
3
if ( is_main_query() ) {
4
    
5
    // Success.

6
    
7
} else {
8
    
9
    // Failure.

10
    
11
}
12
13
?>

Kiểm tra xem chúng ta có đang ở trong vòng lặp hay không: in_the_loop()

Một Thẻ Điều kiện khác là in_the_loop() chỉ đơn giản là trả về TRUE hoặc FALSE tương ứng với code của bạn có đang chạy bên trong vòng lặp hay không.

1
<?php
2
3
if ( in_the_loop() ) {
4
    
5
    // Success.

6
    
7
} else {
8
    
9
    // Failure.

10
    
11
}
12
13
?>

Kết thúc phần hai

Bạn thấy đó - bây giờ bạn đã biết (có lẽ vậy) tất cả các hàm liên quan đến WP_Query! Hãy chú ý theo dõi phần tiếp theo, nơi chúng ta sẽ tìm hiểu về các action và filter có liên quan đến WP_Query.

Bạn có ý kiến ​​hay bất cứ thắc mắc nào về phần này không? Hãy chia sẻ những suy nghĩ của bạn bằng cách bình luận ở dưới đây. Và nếu bạn thích bài viết này, đừng quên chia sẻ nó với bạn bè của mình!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.