Vòng lặp tùy chỉnh / Truy vấn dựa trên trường tùy chỉnh - Thủ thuật CSS

Anonim
Cập nhật lần cuối bởi Jason Witt.

Nếu bạn thiết kế hoặc phát triển các chủ đề hoặc plugin WordPress, rất có thể một ngày nào đó bạn sẽ cần thực hiện truy vấn cho các trường meta tùy chỉnh. Đây là những cặp khóa / giá trị hoàn toàn tùy chỉnh mà bạn có thể đính kèm vào bất kỳ bài đăng, trang hoặc loại bài đăng tùy chỉnh nào. WordPress có giao diện người dùng cơ bản cho chúng theo mặc định, hoặc bạn có thể sử dụng một cái gì đó như Trường tùy chỉnh nâng cao để bắt mắt với chúng. Tuy nhiên, ACF sử dụng các trường tùy chỉnh thông thường.

Trang đoạn trích hiện tại mà bạn đang xem này được viết vào năm 1999. Tại thời điểm đó, để truy vấn các bài đăng có các trường tùy chỉnh cụ thể, bạn cần sử dụng biến toàn cục `$ wpdb`. Điều đó có thể được sử dụng để tạo truy vấn MySQL mà lớp WordPress WP_Query () không hỗ trợ. May mắn thay ngày nay, WordPress có các đối số hỗ trợ các truy vấn cho các trường meta tùy chỉnh.

Ở đây, chúng tôi sẽ trình bày các cách khác nhau mà bạn có thể yêu cầu và lặp lại các bài đăng với các trường tùy chỉnh cụ thể (và giá trị của chúng). Bạn sẽ có thể sử dụng thông tin này cho dù bạn sử dụng WP_Querylớp học query_posts()hay get_posts(). Kể từ query_posts()get_posts()là trình bao bọc cho WP_Querylớp. Tất cả đều chấp nhận những lý lẽ giống nhau.

Đối số truy vấn

Đây là một ví dụ cơ bản về một truy vấn WordPress được lấy từ WordPress Codex.

have_posts() ) ( echo '
    '; while ( $the_query->have_posts() ) ( $the_query->the_post(); echo '
  • ' . get_the_title() . '
  • '; ) echo '
'; ) else ( // no posts found ) /* Restore original Post Data */ wp_reset_postdata();

Điều $argsquan trọng là bit ở đó. Chúng tôi sẽ chuyển các đối số khác nhau để làm cho điều này hoạt động theo cách chúng tôi muốn.

Khi truy vấn meta tùy chỉnh, có hai "nhóm" đối số mà bạn có thể sử dụng. Một nhóm dành cho truy vấn trường meta tùy chỉnh đơn giản và nhóm còn lại dành cho các truy vấn trường meta tùy chỉnh phức tạp hơn. Hãy bắt đầu với nhóm đơn giản.

meta_key

Đối meta_keysố sẽ truy vấn bất kỳ bài đăng nào có thẻ meta trường tùy chỉnh được lưu vào cơ sở dữ liệu, cho dù có hay không một giá trị được lưu cho trường. Đây meta_keylà ID mà bạn cung cấp cho các trường meta của mình. Như thế này:

Ví dụ này sẽ truy vấn bất kỳ bài đăng nào có trường meta tùy chỉnh với ID là “field1”.

$args = array( 'meta_key' => 'field1' );

meta_value

Các meta_valuetruy vấn đối số đăng có giá trị do bạn xác định. Đối meta_valuesố được sử dụng cho các giá trị chuỗi. Ví dụ này sẽ truy vấn bất kỳ bài đăng nào có trường meta tùy chỉnh có giá trị “data1”.

$args = array( 'meta_value' => 'data1' );

Bạn cũng có thể kết hợp cả hai. Ví dụ này sẽ chỉ truy vấn các bài đăng có trường meta tùy chỉnh với ID là “field1” có giá trị là “data1”.

$args = array( 'meta_key' => 'field1', 'meta_value' => 'data1' );

meta_value_num

Đối số meta_value_num tương tự như đối số `meta_value`. Trong đó meta_valueđối số được đề cập cho các giá trị chuỗi, meta_value_numđối số có nghĩa là cho các giá trị số.

Ví dụ này cho thấy cách truy vấn trường meta tùy chỉnh “field1” nếu nó có giá trị là “10”.

$args = array( 'meta_key' => 'field1', 'meta_value_num' => '10', );

meta_compare

Đối meta_comparesố thực hiện chính xác những gì nó có vẻ như. Nó sẽ cho phép bạn sử dụng bộ so sánh với các đối số `meta_value` và` meta_value_num`. Các bộ so sánh bạn có thể sử dụng là '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN' , "GIỮA", "KHÔNG GIỮA", "KHÔNG TỒN TẠI", "REGEXP", "NOT REGEXP" hoặc "RLIKE". Đây là một ví dụ cho thấy cách truy vấn bất kỳ bài đăng nào không có giá trị là "data1".

$args = array( 'meta_key' => 'field1', 'meta_value' => 'data1', 'meta_compare' => '!=', );

Truy vấn phức tạp hơn

meta_query

Đối số chính bạn sẽ sử dụng cho các truy vấn phức tạp là meta_query. Lập luận này tự nó không làm gì cả. Nó chỉ cho WordPress biết rằng bạn muốn tạo một truy vấn cho các trường meta tùy chỉnh. Bạn sẽ thêm các đối số bổ sung trong meta_queryđó sẽ được sử dụng để xác định truy vấn.

khóa, giá trị và so sánh

Những lập luận key, valuelàm việc một cách chính xác theo cùng một cách như meta-key, meta-valuenhư mô tả ở trên. Phức tạp comparetương tự như đơn giản compareở trên, nhưng nó có một danh sách các trình so sánh khác. Phức hợp comparesử dụng '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN ',' KHÔNG GIỮA ',' TỒN TẠI 'hoặc' KHÔNG TỒN TẠI '. valuecó thể là một mảng, nhưng chỉ khi so sánh sử dụng "IN", "NOT IN", "BETWEEN" hoặc "NOT BETWEEN".

Nếu bạn sử dụng 'TỒN TẠI' hoặc 'KHÔNG TỒN TẠI' với compare, bạn không cần chỉ định valueđối số.

Đây là một ví dụ sẽ truy vấn bài đăng nếu nó có “field1” với giá trị “data1” và “field2” với giá trị không phải là “data2”.

$args = array( 'meta_query' => array( array( 'key' => 'field1', 'value' => 'data1' ), array( 'key' => 'field2', 'value' => 'data2', 'compare' => '!=', ) ) );

quan hệ

Các relationđược sử dụng khi bạn muốn dữ liệu meta tùy chỉnh truy vấn bằng cách sử dụng mối quan hệ logic. Bạn có thể sử dụng ANDhoặc OR. Ví dụ: bạn sẽ sử dụng ANDđể so sánh xem data1 và data2 có đáp ứng tiêu chí hay không và bạn sử dụng ORnếu data1 hoặc data2 đáp ứng tiêu chí.

Lập luận này là độc lập. Có nghĩa là nó không xuất hiện trong một tham số trường meta tùy chỉnh riêng lẻ. Hãy xem một ví dụ. Ví dụ này sẽ chỉ truy vấn các bài đăng có “field1” với giá trị là “data1” và “field2” với giá trị là “data2”.

$args = array( 'meta_query' => array( 'relation' => 'AND' array( 'key' => 'field1', 'value' => 'data1', ), array( 'key' => 'field2', 'value' => 'data2', ), ) );

Nếu bạn đã thay đổi relationthành “HOẶC”. Sau đó, nó sẽ truy vấn bất kỳ bài đăng nào nếu “field1” có giá trị là “data1” hoặc nếu “field2” có giá trị là “data2”.

kiểu

Đối typesố cho phép bạn chọn loại dữ liệu để truy vấn. Bạn có thể sử dụng 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME' hoặc 'UNSIGNED'.

Chỉ có thể sử dụng loại "DATE" với compare"BETWEEN" nếu định dạng ngày là "YYYYMMDD".

Ví dụ này sẽ truy vấn bất kỳ bài đăng nào có giá trị của “field1” là số.

$args = array( 'meta_query' => array( array( 'key' => 'field1', 'value' => 'data1', 'type' => 'NUMERIC' ) ) );

Ví dụ về thế giới thực

Cho đến nay, tôi chỉ đưa ra các ví dụ với dữ liệu và trường tùy ý. Bây giờ, tôi muốn cho bạn thấy một ví dụ thực tế về việc truy vấn các trường meta tùy chỉnh.

Kịch bản

Bạn đã tạo một loại bài đăng tùy chỉnh sự kiện. Loại bài đăng sự kiện có trường tùy chỉnh ngày với ID là event_date. Bạn muốn tạo một truy vấn sẽ hiển thị bất kỳ sự kiện nào sẽ bắt đầu vào ngày hiện tại trong 30 ngày tới.

Chúng ta sẽ sử dụng meta_queryđối số vì chúng ta muốn sử dụng typeđối số để xác định trường “event_date” là kiểu dữ liệu “DATE”.

Đây là truy vấn:

$args = array( 'post_type' => 'post', 'posts_per_page' => -1, 'post_status' => 'publish', 'meta_query' => array( array( 'key' => 'event_date', 'value' => array( date( 'Ymd', strtotime( '-1 day' ) ), date( 'Ymd', strtotime( '+31 days' ) ) ), 'compare' => 'BETWEEN', 'type' => 'DATE' ) ) ); $event_query = new WP_Query( $args );

Các valuelà một mảng của ngày hiện tại - 1 ngày và 31 ngày, kể từ ngày hiện tại. Vì chúng tôi đang sử dụng bộ so sánh “GIỮA” chỉ các bài đăng giữa mảng giá trị sẽ được truy vấn, vì vậy chúng tôi muốn bù đắp chúng trước một ngày.

Với truy vấn này, bạn sẽ hiển thị bất kỳ sự kiện nào xảy ra trong 30 ngày tới.

Phần kết luận

Các WP_Querylớp là một lớp rất linh hoạt mà sẽ cho phép bạn tạo ra vô số các câu hỏi tùy chỉnh. Nếu bạn muốn tìm hiểu thêm về các đối số khác nhau mà bạn có thể sử dụng cho các truy vấn, tôi khuyên bạn nên xem qua WP_Querytrang codex.