Sử dụng Array trong PHP và WP_Query trong WordPress

Share vì hữu ích

Việc làm việc với backend của WordPress để lấy 1 danh sách bài viết dường như là điều mà bất cứ developer nào sẽ động tới nếu cần làm 1 full website. Hãy cùng Code Tốt khám phá sự giống và khác nhau của hình thức query này với list array trong PHP.

Array trong PHP là gì?

Thực chất trong bất cứ ngôn ngữ nào, việc các lớp dữ liệu được sắp xếp theo 1 thứ tự chia nhiều tầng ta đều có thể tạm gọi là array. Bằng cách tạo ra array, ta có thể tạo ra vòng lặp để truy xuất/tương tác với từng item trong array đó.

Trong PHP, array là một object tương đối quen thuộc, giúp bạn sử dụng hiệu quả các vòng lặp thông qua for hoặc foreach. Hãy bắt đầu bằng 1 ví dụ cơ bản:

$list = array(2,4,6,8,10);

for( $i = 0; $i < count($list); $i++) {
  // Bạn có thể lần lượt gọi ra từng item trong $list
  $list[ $i ];
}

Với array nhiều dữ liệu và phức tạp hơn, ta có thể sử dụng foreach

$list = array(
  array(
    'title' => 'Title #1',
    'link' => 'Link #1'
  );
  array(
    'title' => 'Title #2',
    'link' => 'Link #'2
  );
);
foreach( $list as $item ) {
  // Giờ bạn có thể access vào các item như 1 array nữa
  $item['title];
  $item['link'];
}

Truy xuất dữ liệu thông qua số thứ tự của item trong PHP array

Với array, sẽ rất nhanh nếu bạn biết số thứ tự của item trong list và access thằng vào nó (giúp tăng hiệu suất). Tuy nhiên, lưu ý array của PHP hay nhiều ngôn ngữ lập trình khác đều có index bắt đầu bằng 0 chứ không phải 1 nhé.

Như ví dụ với $list ở trên, tôi có thể truy xuất dữ liệu như sau:

// First item
$list[0]['title'];
$list[0]['link]
// or
$first_item = $list[0];

Như vậy tạm thời chúng ta nắm được cơ bản vài thao tác để sử dụng array trong PHP rồi đúng không nào.

WP_Query trong WordPress

Chúng ta nhắc tới WP_Query bởi vì về cơ bản khi thực hiện WP_Query thì giá trị trả về cũng sẽ là 1 PHP Array. Điều này cần được phân biệt cụ thể sự giống và khác nhau như thế nào với PHP
Array, vì nhiều bạn mới bắt đầu làm việc với WordPress thường phân biệt nó khá tệ.

Hãy bắt đầu bằng 1 WP_Query đơn giản nhất:

Ta cần define các loại dữ liệu sẽ gọi trước khi query

$args = array(
  'post_type' => 'press',
  'post_status' => 'publish',
  'post_per_page' => 5
);

// Sau đó ta gọi 1 object để tạo array. Dùng get_posts( $args ) hoặc new WP_Query( $args ) . Như vậy, $list ở dưới đây sẽ trở thành 1 PHP Array (đừng ngại test bằng cách sử dụng var_dump( $list ) nhé).

$list = get_posts( $args );

// Check điều kiện nhỡ nếu không có post nào trước khi output dữ liệu. Khi dùng get_posts thì bạn cần gọi setup_postdata( $post ) ở bên trong foreach để nó nhận biết các giá trị của Post Object.

if( $list ) {
  foreach($list as $post) : setup_postdata( $post );
    $title = get_the_title(); // Bạn không cần gọi get_the_ID() nữa nhé
    // or
    $title = $post->post_title; // Không hay bằng cách trên
  endforeach;
  wp_reset_postdata(); // Để các biến access trong loop không bị sử dụng ngoài vòng loop
}

Tạm thời, ta nắm được vòng loop của WP_Query cho phép bạn truy xuất vào các post nằm trong vòng loop đó, nhưng các dữ liệu sẽ được gọi thông qua việc $post đã được xác định ID rồi.

Bài toán giữa PHP Array và WP_Query

Giờ quay trở lại câu chuyện tại sao cần phân biệt sự khác nhau giữa 2 thứ tưởng chừng có vẻ khác nhau này. Có 1 bài toán mà thường những nhà lập trình có kinh nghiệm thường đưa ra, đó là quy định 1 tiêu chuẩn về đầu mối dữ liệu như hình bên dưới.

Vấn đề nảy sinh khi mà biến $title của PHP Array và get_the_title() của WP_Query không thể đồng thời sử dụng trong template mà cần được nhận dạng và xác định trước khi cho vào loop. Nhiều plugin từ bên thứ ba thường sử dụng list array để truy xuất, chẳng hạn như plugin Advanced Custom Fields với các loại dữ liệu như Repeater, Post Objects,..

Không lẽ với cùng 1 template, bạn phải mất công gọi 2 lần cho 2 biến kia?

Bài toán sẽ có câu trả lời tốt nhất nếu ta vận dụng phương thức đồng nhất dữ liệu, hay nói cách khác, ta chuyển đổi dữ liệu của WP_Query thành 1 PHP Array đơn thuần để có thể truy xuất như nhau khi trong template.

Chuyển đổi dữ liệu WP_Query sang PHP Array

Hãy bắt đầu bằng cách sử dụng nguyên vòng loop của WP_Query ở trên, nhưng trong foreach ta sẽ add array vào 1 list array rỗng khác. Đặt tên là 1 function để nó sẵn sàng return nếu bạn cần gọi.

function get_post_list() {
  //  Không nhắc lại mấy đoạn code đầu nữa nhé... $args, $list = get_posts( $args );
  // Ta đặt 1 biến array trống
  $new_list = array();
  foreach( $list as $post) : setup_postdata( $post );
    $item = array(
      'title' => get_the_title(),
      'link'  => get_the_permalink()
    );
    // Với mỗi post chạy qua, $item sẽ được thêm vào $new_list như 1 array
    $new_list[] = $item;
  endforeach;
  wp_reset_postdata();
  return $new_list;
}

Còn bên trong template, bạn chỉ cần gọi:

foreach( $list as $item ) :
  echo $item['title'];
  echo $item['link'];
endforeach;

Bạn thấy vấn đề đã đơn giản hơn không? 1 Function đã định nghĩa và quy đổi dữ liệu cho bạn về 1 PHP Array và sẵn sàng nạp vào template bất kỳ theo định dạng loop array cơ bản.

Featured Image: gavick

Share vì hữu ích

Tác giả: Khôi 'Pro' Nguyễn

Technical Lead tại Solis Lab. Quản lý ngôn ngữ tại vi.wordpress.org.

Một bình luận cho “Sử dụng Array trong PHP và WP_Query trong WordPress”

Trả lời