Hướng Dẫn Loop/Query Dựa Vào Custom Fields WordPress

Nếu bạn thiết kế hoặc phát triển themes hoặc plugin WordPress, các bạn có thể làm việc với các truy vấn cho các custom fields. Đâ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ỳ post, page hoặc bất cứ custom post tye nào. Các bạn có thể sử dụng plugin Advanced Custom Fields để thêm các trường tùy chỉnh.

Mình sẽ giới thiệu cho các bạn các request và loop các bài post dựa vào custom fields. Các bạn có thể sử dụng cho WP_Query, query_posts(), or get_posts().

Tham Số Truy Vấn

Đây là ví dụ đơn giản của truy vấn trong WordPress:

<?php
// The Query
$the_query = new WP_Query( $args );

// The Loop
if ( $the_query->have_posts() ) {
  echo '<ul>';
  while ( $the_query->have_posts() ) {
    $the_query->the_post();
    echo '<li>' . get_the_title() . '</li>';
  }
  echo '</ul>';
} else {
  // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();

$args bao gồm các tham số khác nhau, giúp chúng ta lấy ra các bài posts the điều kiện mong muốn.

Khi truy vấn sử dụng custom meta, có 2 nhóm arguments các bạn có thể sử dụng. Một nhóm là các truy vấn custom meta field đơn giản và nhóm còn lại là các truy vấn phức tạp.

Meta Key

Đây là 1 ví dụ về meta key:

Đoạn code bên dưới sẽ lấy ra các bài post có custom meta vói ID là “field1”
$args = array( 'meta_key' => 'field1' );

Meta Value

meta_value là tham số để query các post có giá trị các bạn đưa vào:

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

Chúng ta có thể kết hợp cả meta_key và meta_value như vậy:

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

meta_value_num

Tham số meta_value_num tương tự như meta_value, tuy nhiên meta_value truyền vào là 1 string thì meta_value_num giá trị truyền vào là numerical.

Ví dụ bên dưới sẽ query “field1” có giá trị là “10”:

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

meta_compare

Tham số meta_compare có chức năng giống như tên của nó. Nghĩ là bạn sử dụng để so sánh các giá trị meta_value hoặc meta_value_num. Các biểu thức so sánh có thể dùng như: ‘=’, ‘!=’, ‘>’, ‘>=’, ‘<‘, ‘<=’, ‘LIKE’, ‘NOT LIKE’, ‘IN’, ‘NOT IN’, ‘BETWEEN’, ‘NOT BETWEEN’, ‘NOT EXISTS’, ‘REGEXP’, ‘NOT REGEXP’ or ‘RLIKE’. Ví dụ bên dưới sẽ query các bài post không có giá trị meta_value bằng “data1”:

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

Các Truy Vấn Phức Tạp Khác

meta_query

Tham số chính bạn sẽ dùng cho complex queries là meta_query. Tham số này bản thân nó không làm gì cả. Nó chỉ dùng để nói với WordPress rằng “tao muốn tạo một query với meta fields”. Các bạn sẽ cần phải thêm các tham số vào meta_query để định nghĩa câu query của mình.

key, value, and compare

Tham số keyvalue giống như meta_keymeta_value đã định nghĩa ở phía trên. complex compare cũng giống như phía trên, nhưng chỉ khác một xíu ở danh sách các toán tử so sánh. Complex compare sử dụng: ‘=’, ‘!=’, ‘>’, ‘>=’, ‘<‘, ‘<=’, ‘LIKE’, ‘NOT LIKE’, ‘IN’, ‘NOT IN’, ‘BETWEEN’, ‘NOT BETWEEN’, ‘EXISTS’, or ‘NOT EXISTS’. value có thể là một array khi compare sử dụng là ‘IN’, ‘NOT IN’, ‘BETWEEN’, or ‘NOT BETWEEN’.

Khi sử dụng ‘EXISTS’ hoặc ‘NOT EXISTS’, các bạn không cần tham số value.

Dưới đây là ví dụ query các bài posts có “field1” với giá trị là “data1” và “field2” với giá trị khác “data2”:

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

Relation

relation được sử dụng khi các ban muốn truy vấn custom meta data dựa vào logical relationship. Các bạn có thể sử dụng AND or OR. Ví dụ sử dụng AND để so sánh nếu data1 và data2 đáp ứng điều kiện, hoặc sử dụng OR nếu data1 hoặc data2 đáp ứng điều kiện.

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

Type

Tham số type cho phép các bạn chọn loại data truy vấn. Các bạn có thể sụng ‘NUMERIC’, ‘BINARY’, ‘CHAR’, ‘DATE’, ‘DATETIME’, ‘DECIMAL’, ‘SIGNED’, ‘TIME’, or ‘UNSIGNED’.

“DATE” có thể được sử dụng để so sánh “BETWEEN” nếu định dạng ngày là “YYYYMMDD”.

Ví dụ bên dưới sẽ query các bài post khi giá trị là “field1” là numeric (số)

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

Ví Dụ:

Mình có câu truy vấn như vậy:

$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( '+30 days' ) ) ),
      'compare' => 'BETWEEN',
      'type'    => 'DATE'
    ) 
  )
);
$event_query = new WP_Query( $args );

Câu query phía trên sẽ lấy tất cả các bài posts đã publish có event_date nằm trong khoảng ngày hôm qua đến 30 ngày tiếp theo.

Tổng Kết:

WP_Query Class khá linh động, giúp chúng ta tạo các truy vấn tùy chỉnh lấy dữ liệu ra theo mong muốn. Để tìm hiểu rõ hơn các bạn có thể truy cập vào đây.

Leave a Comment