20. Tìm hiểu đối tượng WP_Query trong WordPress
Last updated
Was this helpful?
Last updated
Was this helpful?
WP_Query được xem là một phần khá là quan trọng đối với WordPress, nếu bạn sử dụng thành thạo nó thì xem như phần tương tác databasekhông còn là vấn đề khó với bạn. Đối tượng này có thể gọi và lấy dữ liệu từ table ra rất nhanh và dễ dàng ở bài Tìm hiểu đối tượng WP_Query trong WordPress thì tôi sẽ đọc document rồi hướng dẫn lại bạn theo cách của tôi, vì thế sẽ có nhiều sai sót trong code, nói trước để các bạn thông cảm và rộng lượng bỏ qua hen.
Bạn có thể vào đây để tìm hiểu thêm nếu như bài viết này không đáp ứng đầy đủ kiến thức mà bạn đang quan tâm.
1/ Cấu trúc folder plugin kenshin query
Như thường lệ, bất kì tôi thao tác một vấn đề nào đó trong WordPress thì tôi sẽ tạo mới một plugin để thực thi các thao tác cho nó tiện.
Cấu trúc plugin
kenshin-query – widgets – kenshin-query.php (File xử lý chính của plugin)
Nội dung file kenshin-query.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
/**
* @package Kenshin Query
* @version 0.1
*/
/*
Plugin Name: Kenshin WP Query
Plugin URI: http://laptrinhweb.org
Description: Đây là một plugin dùng để tương tác vói WP_Query.
Author: Kenshin
Version: 0.1
Author URI: None
*/
define('KENSHIN_QUERY_PLUGIN_URL', plugin_dir_url(__FILE__));
define('KENSHIN_QUERY_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('KENSHIN_QUERY_INCLUDES_DIR', KENSHIN_QUERY_PLUGIN_DIR .'/includes');
define('KENSHIN_QUERY_DIR', KENSHIN_QUERY_PLUGIN_DIR . '/widgets');
require_once KENSHIN_QUERY_DIR. '/widget-dashboard.php';
new Kenshin_Widget_Dashboard();
Bạn chú ý đoạn code gọi đến đường dẫn tuyệt đối để gọi đến file xử lý Widget.
1
2
require_once KENSHIN_QUERY_DIR. '/widget-dashboard.php';
new Kenshin_Widget_Dashboard();
Tôi sẽ giới thiệu đến bạn Hook Action wp_dashboard_setup, hook này sẽ xử lý đầu tiên và hiển thị dữ liệu ở page Dashboard trong vùng admin, ngoài ra phương thức wp_add_dashboard_widget() sẽ có nhiệm vụ hiển thị Widget trong vùng Dashboard chứ nó không nằm trong khu vực quản lý Widget.
Nội dung file widget-dashboard.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class Kenshin_Widget_Dashboard extends WP_Widget {
public function __construct(){
add_action('wp_dashboard_setup', array($this, 'widget'));
}
// Hiển thị dữ liệu từ phương thức display
public function widget(){
wp_add_dashboard_widget('kenshin_widget_dashboard', 'My Widget', array($this, 'display'));
}
public function display(){
echo '<p>Đây là Widget Dashboard</p>';
}
}
widget-dashboard
Phương thức display chính là nơi mà chúng ta sẽ gọi tới đối tượng WP_Query() để tương tác với database.
2/ Tương tác với đối tượng WP_Query()
Thông thường nếu bạn muốn lấy dữ liệu trong một table nào đó chẳng hạn như là table wp_post đi hen, nếu dùng biến toàn cục $wpdb để gọi tới các phương thức hỗ trợ như là get_results(), get_row()...vv việc này sẽ làm bạn tốn thời gian, nhưng với đối tượng WP_Query() thì bạn sẽ nhẹ nhàng hơn trong các thao tác gọi tới và show dữ liệu ra ngoài themes, thôi không nói nhiều nửa , xoắn tay áo lên và thực hành để nắm rõ bài hơn.
Tôi sẽ khai báo biến $wpQuery để khởi tạo đối tượng WP_Query() và sau đó in nó ra xem dữ liệu bên trong trả về là gì.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class Kenshin_Widget_Dashboard extends WP_Widget {
public function __construct(){
add_action('wp_dashboard_setup', array($this, 'widget'));
}
// Hiển thị dữ liệu từ phương thức display
public function widget(){
wp_add_dashboard_widget('kenshin_widget_dashboard', 'My Widget', array($this, 'display'));
}
public function display(){
echo '<p>Đây là Widget Dashboard</p>';
$wpQuery = new WP_Query();
echo "<pre>";
print_r($wpQuery);
echo "</pre>";
}
}
Đây là mảng dữ liệu được trả về.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
WP_Query Object
(
[query] =>
[query_vars] => Array
(
)
[tax_query] =>
[meta_query] =>
[date_query] =>
[queried_object] =>
[queried_object_id] =>
[request] =>
[posts] =>
[post_count] => 0
[current_post] => -1
[in_the_loop] =>
[post] =>
[comments] =>
[comment_count] => 0
[current_comment] => -1
[comment] =>
[found_posts] => 0
[max_num_pages] => 0
[max_num_comment_pages] => 0
[is_single] =>
[is_preview] =>
[is_page] =>
[is_archive] =>
[is_date] =>
[is_year] =>
[is_month] =>
[is_day] =>
[is_time] =>
[is_author] =>
[is_category] =>
[is_tag] =>
[is_tax] =>
[is_search] =>
[is_feed] =>
[is_comment_feed] =>
[is_trackback] =>
[is_home] =>
[is_404] =>
[is_comments_popup] =>
[is_paged] =>
[is_admin] =>
[is_attachment] =>
[is_singular] =>
[is_robots] =>
[is_posts_page] =>
[is_post_type_archive] =>
[query_vars_hash:WP_Query:private] =>
[query_vars_changed:WP_Query:private] => 1
[thumbnails_cached] =>
[stopwords:WP_Query:private] =>
)
Nhiều phần tử được trả về, nhìn vào bạn chẳng biết nó là gì đâu, lúc bấy giờ bạn chú ý tới phần tử posts, do kiểu dữ liệu là object(đối tượng) nên tôi sẽ gọi tới phần tử này như sau. Nhưng để làm được điều này thì bạn cần phải truyền tham số vào WP_Query(), tôi cho nó tham số là author=1 , tức là nó sẽ lấy ra các bài viết của tác giả có ID là 1 tức là admin đấy bạn.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class Kenshin_Widget_Dashboard extends WP_Widget {
public function __construct(){
add_action('wp_dashboard_setup', array($this, 'widget'));
}
// Hiển thị dữ liệu từ phương thức display
public function widget(){
wp_add_dashboard_widget('kenshin_widget_dashboard', 'My Widget', array($this, 'display'));
}
public function display(){
echo '<p>Đây là Widget Dashboard</p>';
$wpQuery = new WP_Query('author=1');
echo "<pre>";
print_r($wpQuery->posts);
echo "</pre>";
}
}
Lưu ý: Bạn cần chuẩn bị một số bài viết với kiểu định dạng là post để có cái mà lấy ra nhé
wp-query-posts
Với đoạn code trên thì tôi đã gọi tới table WP_post trong database và nó nó lấy toàn bộ phần tử trong table đó, và hiển thị tất cả bai viết của author có ID là 1, do dữ liệu khá nhiều nên tôi không thể nào chụp bao quát toàn màn hình được, bạn hãy tự kiểm tra lấy.
Với author =1 thì tôi có tổng cộng là 9 bài viết, lúc này tôi muốn hiển thị tiêu đề của 9 bài viết trong cặp thẻ <ul và <li, vậy tôi thực hiện hành động này ra sao?
Lúc này ngay tại document tôi thấy phần Standard Loop (Tức là vòng lặp) với đối tượng WP_Query() mà bạn muốn show dữ liệu ra thì phải đi kèm với thằng The Loop.
standard-loop
Đây là đoạn code demo mà document cung cấp cho chúng ta, tôi sẽ copy và sửa lại theo ý tôi như sau, phương thức get_the_title() dùng để lấy ra tiêu đề bài viết. Chú ý tới phương thức the_post(), nếu vòng lặp không có nó sẽ thành một vòng lặp vô tận và làm trình duyệt của bạn bị treo, tôi sẽ giải thích kỹ hơn ở một bài khác. Còn phương thức have_posts() dùng để kiểm tra xem có bài viết hay không.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
class Kenshin_Widget_Dashboard extends WP_Widget {
public function __construct(){
add_action('wp_dashboard_setup', array($this, 'widget'));
}
// Hiển thị dữ liệu từ phương thức display
public function widget(){
wp_add_dashboard_widget('kenshin_widget_dashboard', 'My Widget', array($this, 'display'));
}
public function display(){
echo '<p>Đây là Widget Dashboard</p>';
$wpQuery = new WP_Query('author=1');
// Vòng lặp lẩy ra bài viết thuộc author = 1
if ($wpQuery->have_posts()){
echo '<ul>';
while($wpQuery->have_posts()){
$wpQuery->the_post();
echo '<li>'. get_the_title() .'</li>';
}
echo '</ul>';
}
}
}
Với đoạn code trên thì tôi đã lấy ra được 9 bài viết thuộc quyền sở hữu của author = 1.
have-posts-the-posts
Lúc này tôi muốn gắn link vào tiêu đề bài viết và mỗi khi click vào link của từng tiêu đề thì sẽ gọi tới trang edit ứng với từng ID bài viết, vậy người nông dân phải làm thao ?
Đường dẫn sẽ có dạng là http://localhost/wp/wp-admin/post.php?post=25&action=edit, vậy thì để gọi tới đường dẫn tương đối tới url wp-admin thì WordPress cung cấp cho chúng ta phương thức admin_url(), vậy còn ID bài viết lấy ra bằng cách nào ?, lúc này tôi sẽ giới thiệu bạn thêm phương thức get_the_ID(), nó giúp bạn lấy ra ID của từng bài viết. Và tôi có đoạn code như sau.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
class Kenshin_Widget_Dashboard extends WP_Widget {
public function __construct(){
add_action('wp_dashboard_setup', array($this, 'widget'));
}
// Hiển thị dữ liệu từ phương thức display
public function widget(){
wp_add_dashboard_widget('kenshin_widget_dashboard', 'My Widget', array($this, 'display'));
}
public function display(){
echo '<p>Đây là Widget Dashboard</p>';
$wpQuery = new WP_Query('author=1');
$link = '#';
// Vòng lặp lẩy ra bài viết thuộc author = 1
if ($wpQuery->have_posts()){
echo '<ul>';
while($wpQuery->have_posts()){
$wpQuery->the_post();
$link = admin_url('post.php?post='.get_the_ID().'&action=edit');
echo '<li><a href="'. $link .'">'. get_the_title() .'</a></li>';
}
echo '</ul>';
}
}
}
Với đoạn code trên thì tôi đã thực hiện thành công việc gắn link vào từng tiêu đề bài viết, khi click vào sẽ nhảy tới trang edit của từng bài viết.
add-link-get-the-title-get-the-id
Lúc bấy giờ sẽ phát sinh ra một vấn đề, nếu tham số đưa vào đối tượng WP_Query() không tồn tại thì sẽ xuất hiện thông báo lỗi “Không có bài viết nào của tác giả này”, rất là đơn giản bạn chỉ cần else ở ngay phần if như sau.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
class Kenshin_Widget_Dashboard extends WP_Widget {
public function __construct(){
add_action('wp_dashboard_setup', array($this, 'widget'));
}
// Hiển thị dữ liệu từ phương thức display
public function widget(){
wp_add_dashboard_widget('kenshin_widget_dashboard', 'My Widget', array($this, 'display'));
}
public function display(){
echo '<p>Đây là Widget Dashboard</p>';
$wpQuery = new WP_Query('author=1');
$link = '#';
// Vòng lặp lẩy ra bài viết thuộc author = 1
if ($wpQuery->have_posts()){
echo '<ul>';
while($wpQuery->have_posts()){
$wpQuery->the_post();
$link = admin_url('post.php?post='.get_the_ID().'&action=edit');
echo '<li><a href="'. $link .'">'. get_the_title() .'</a></li>';
}
echo '</ul>';
} else {
echo 'Không có bài viết nào của tác giả này';
}
}
}
Chỗ author = 1 bạn thay thế bất một ID bất kì, đại loại như là 123, sau đó F5 lại trình duyệt kiểm tra xem có xuất ra câu thông báo lỗi mà bạn vừa khai báo không.
2/ Lời kết
Còn rất nhiều phương thức & tham số nằm trong đối tượng WP_Query() mà tôi không thể nào trình bày hết được, tôi sẽ hướng dẫn bạn các phương thức còn lại ở một bài khác, như vậy thông qua bài Tìm hiểu đối tượng WP_Query() trong WordPress thì bạn đã phần nào thấy được sức mạnh và tầm quan trọng của nó ra sao. Chỉ cần sử dụng thành thạo nó sẽ rất có lợi cho bạn trong việc thiết kế giao diện về sau, bài viết chỉ ở mức căn bản nhưng nó chứa đựng đầy đủ nền tảng để bạn tự tìm hiểu thêm về đối tượng này.
Series Navigation