Giả sử bạn muốn làm điều gì đó độc đáo với cách các bài báo được truy xuất và hiển thị trên một trang cụ thể của website. Có thể bạn muốn có nhiều truy vấn, một truy vấn cho các bài viết nổi bật và một truy vấn cho các bài viết gần đây. Hoặc có thể bạn muốn loại trừ một số danh mục nhất định khỏi các bài viết trên blog của bạn.

Dù mục tiêu của bạn là gì, bạn quyết định xây dựng một mẫu trang tùy chỉnh với một truy vấn thực hiện một cái gì đó hơi khác một chút. Tuy nhiên, trước khi bắt đầu viết mã, bạn phải đưa ra quyết định: bạn nên sử dụng công cụ truy vấn WordPress nào?

WordPress cung cấp một số loại truy vấn khác nhau: WP_query, query_posts (), get_posts (), get_pages (), Và Pre_get_posts. Trong nhiều trường hợp, bạn có thể sử dụng nhiều hơn một trong những công cụ này để đạt được kết quả mong muốn. Tuy nhiên, câu hỏi vẫn còn, bạn nên sử dụng cái nào?

Chúng tôi sẽ nói trong hướng dẫn này về một số chức năng mà bạn có thể sử dụng trên WordPress.

WP_Query

« WP_Query Là lớp học phía sau (gần) mọi yêu cầu WordPress. Khi bạn tải một trang hoặc bài viết trên WordPress, một đối tượng " WP_query "," $ Query "được tạo và lấy dữ liệu từ các bài báo hoặc trang có liên quan. Thực tế, " WP_Query Đó là công cụ cung cấp nhiều truy vấn nhất trên WordPress.

Bạn sử dụng " WP_Query Mà không nhận ra nó. Khi bạn tải một URL, nhân WordPress sẽ tạo một truy vấn tới cơ sở dữ liệu với lớp " WP_Query Dựa trên URL và các thông số trong đó. Vì vậy, nếu bạn truy cập một trang có URL như "http://example.com/categorie/wordpress" thì WordPress sẽ tạo một đối tượng " WP_Query Nó định vị tất cả các bài viết trong danh mục "WordPress" và tải tất cả các bài báo.

« WP_Query »Nguồn cấp dữ liệu truy vấn cho các bài báo và trang tiêu chuẩn được tích hợp trong WordPress và cũng có thể được sử dụng để tạo các truy vấn tùy chỉnh. Điều này được thực hiện với một chút "lập trình hướng đối tượng". Tất cả những gì bạn phải làm là tạo một biến mới và khai báo nó như một thể hiện mới của lớp " WP_Query Như thế này:

<?php
$args = mảng(
  // Xác định các đối số cho truy vấn mới
);

$myQuery = WP_Query mới( $args );

Tất nhiên, sau đó bạn phải làm một cái gì đó với kết quả của truy vấn. Tuy nhiên, điều này là vượt quá phạm vi của hướng dẫn này.

Là một nhà phát triển WordPress, bạn có thể sẽ sử dụng " WP_Query Thường xuyên hơn bất kỳ chức năng khác. Anh ấy đa năng và mạnh mẽ. Mặc dù một số truy vấn khác được đề cập trong hướng dẫn này có thể giúp bạn tiết kiệm thời gian, nhưng nói chung bạn không thể sai với " WP_Query Đối với nhu cầu viết truy vấn tùy chỉnh của bạn.

Ngoại lệ duy nhất cho quy tắc này là khi tất cả những gì bạn cần làm là lọc kết quả của truy vấn tiêu chuẩn. Trong trường hợp này, " Pre_get_posts Là công cụ bạn nên sử dụng. Vì vậy, chúng ta hãy xem xét phần sau.

Pre_get_posts

« Pre_get_posts Là một cái móc, không phải một chức năng. Thay vì truy vấn lại cơ sở dữ liệu, " Pre_get_posts "Cho phép bạn sửa đổi đối tượng" $ query "trước khi cơ sở dữ liệu được truy vấn, để lọc hiệu quả các kết quả được trả về bởi truy vấn chuẩn.

Trong hầu hết các trường hợp, " Pre_get_posts Được ghép với các thẻ có điều kiện để lọc kết quả truy vấn trong các tình huống cụ thể. Ví dụ: bạn có thể sử dụng " Pre_get_posts Để trả lại một số bài báo khác về trang chủ của trang web. Về bản chất, nếu bạn muốn chạy truy vấn chuẩn, nhưng hãy sửa đổi nó bằng cách nào đó, " Pre_get_posts Sẽ là công cụ làm việc của bạn.

Có một số trường hợp trong đó " Pre_get_posts Không làm việc và không nên được sử dụng. các WordPress Codex gợi ý hai trong số các trường hợp sau:

Bộ lọc Pre_get_posts Không nên được sử dụng để sửa đổi truy vấn trên mẫu cho một trang vì điều này sẽ can thiệp vào các thuộc tính đã được đặt bởi " parse_query () '.

Bộ lọc Pre_get_posts Sẽ không hoạt động nếu được thêm vào tệp mẫu chẳng hạn như 'archive.php', vì các tệp này được tải sau khi truy vấn chính đã được thực thi.

Điều này dẫn chúng ta đến đâu? Nó có nghĩa là " Pre_get_posts "Là một lựa chọn tuyệt vời để sửa đổi các yêu cầu tải bài đăng trong vòng lặp chính của trang chủ, trang blog và các trang riêng lẻ như" page.php "và" single.php ".

Tuy nhiên, đôi khi lọc truy vấn tiêu chuẩn là không đủ. Có thể bạn muốn sử dụng nhiều truy vấn WordPress hoặc thao tác kết quả theo cách " Pre_get_posts Sẽ không giúp. Trong trường hợp này, bạn có thể đi đến " WP_Query Hoặc sử dụng các tùy chọn bổ sung khác.

query_posts ()

Nếu bạn đang tìm kiếm Hướng dẫn WordPress, bạn sẽ tìm thấy nhiều hướng dẫn giới thiệu việc sử dụng " query_posts () ". Tuy nhiên, hướng dẫn hiện đại là phổ biến chống lại việc sử dụng này. Đây là lý do tại sao.

Chức năng query_posts () "Thay thế đối tượng truy vấn chính," $ query "được tạo và sử dụng bởi vòng lặp mặc định do lõi WordPress quản lý. Nó thực hiện điều này bằng cách tạo một phiên bản mới " WP_Query "Và gán nó cho" object "biến toàn cục.

Điều này có thể gợi ý rằng " query_posts () Thực sự mạnh mẽ và hữu ích. Tuy nhiên, chơi với vòng lặp cơ bản có nghĩa là " query_posts () Có nhược điểm lớn và do đó nên tránh.

WordPress Codex chính thức cung cấp một số lý do để sử dụng " query_posts () Nên tránh trong phần lớn các trường hợp. Những lý do chính được đưa ra bao gồm:

Sử dụng " query_posts () "Có thể làm chậm đáng kể thời gian tải.

Vì " query_posts () »Thay thế dữ liệu truy vấn tiêu chuẩn, nó có thể gây ra một số vấn đề với phân trang và phá hoại trên các trang sử dụng nhiều truy vấn.

Tóm lại, việc sử dụng " query_posts () Là một đề xuất nguy hiểm. Trong thực tế, tài liệu chính thức mở ra với cảnh báo: Chức năng này sẽ thay thế hoàn toàn truy vấn chính và không dành cho các plugin hoặc chủ đề sử dụng. Cách tiếp cận quá đơn giản của nó để sửa đổi truy vấn chính có thể có vấn đề và nên tránh càng nhiều càng tốt.

Nói cách khác, nếu bạn đang viết mã một chủ đề hoặc plugin, đó chính xác là điều mà đại đa số chúng ta đang làm, bạn nên tránh sử dụng " query_posts () ". Thay vào đó, hãy tạo một đối tượng hoàn toàn mới " WP_Query »Hoặc sử dụng« get_posts () "," get_pages () "Hoặc" Pre_get_posts '.

Nó chắc chắn không phải là tất cả, có những chức năng khác mà chúng ta sẽ xem xét trong một hướng dẫn trong tương lai. Cho đến lúc đó, tôi muốn bạn một mã hóa tốt.