Sử dụng tham số để truy vấn với WP_Query trong WordPress

Khi bạn viết theme hay lập trình Plugin, việc truy vấn sử dụng WP_Query trong WordPress là điều không thể tránh khỏi. Có những yêu cầu thiết kế website khó khăn, nhưng nếu nắm bắt được truy vấn WP_Query với các tham số đầu vào và giá trị đầu ra sẽ làm việc code trở nên dễ dàng hơn rất nhiều. Trong bài viết này, mình sẽ chia sẻ với bạn một số cách để sử dụng WP_Query trong WordPress, giúp bạn nắm hiểu rõ hơn về các tham số đầu vào và giá trị đầu ra khi truy vấn.

Cách sử dụng WP_Query trong WordPress

Trước khi bắt đầu vào tìm hiểu các tham số đầu vào và giá trị đầu ra, mình cần nắm rõ cách sử dụng của WP_Query, và để theo dõi kết quả xem câu query đó trả về những thứ gì bạn có thể dùng một plugin của WordPress để làm điều đó là plugin Debug Bar.

WP_Query là một lớp đối tượng được định nghĩa, hoạt động của nó liên quan đến việc truy vấn phức tạp từ các loại Post và Page (kể cả custom post type). Cú pháp của WP_Query như sau:

Trong đó:

  • $query: là biến đối tượng trả về.
  • $args: là một biến mảng chứa các tham số truy vấn.

Để kiểm tra có bài đăng nào trả về trong truy vấn không bạn sử dụng hàm $query->have_posts(). Giá trị trả về của hàm have_posts() là TRUE hoặc FALSE.

Ví dụ như sau:

Dữ liệu trả về được sử dụng trong vòng lặp để lấy dữ liệu. Ví dụ như sau:

Trong đó:

  • $the_query->the_post(): Trả về mảng chứa dữ liệu.
  • wp_reset_postdata(): Khi sử dụng $the_query->the_post(), bạn nên sử dụng để reset về dữ liệu truy vấn mặc định.

Tham số truy vấn trong WP_Query WordPress

Tham số truy vấn theo tác giả

Khi sử dụng tham số “author”, kết quả trả về sẽ là các bài viết của 1 hoặc nhiều các tác giả được liêt kê trong tham số. Có nhiều dạng liệt kê như: ID, name, một mảng, hoặc loại bỏ tác giả đó ra khỏi truy vấn. Cụ thể như sau:

Tham số truy vấn theo danh mục bài viết

Để thực hiện lấy các bài viết trong danh mục, bạn sử dụng các tham số như ‘cat’, ‘category_name’,…. Các cách dùng cụ thể của các tham số như sau:

Tham số truy vấn theo Tags

Để truy vấn lấy danh sách các bài viết theo Tag cũng tương tự như danh mục, cũng có các tham số như sau:

Tham số truy vấn theo Taxonomy

Khi bạn cần lấy các bài viết theo phân loại bài viết thì bạn có thể sử dụng Query với các tham số sau để lấy được danh sách các bài viết.

Lấy các bài viết theo một Taxonomy cụ thể.

Lọc các bài viết với tham số AND

Lọc các bài viết với tham số OR

Lọc các bài viết với tham số OR và AND

Tham số truy vấn tìm kiếm (search)

Được sử dụng khi bạn muốn tìm kiếm một bài viết, tác giả,…..

Tham số truy vấn theo Post và Page

Lấy các bài viết theo post và page.

Lấy danh sách bài viết kiểu post ngoại trừ các post có id được liệt kê.

Tham số truy vấn Post và Page sử dụng mật khẩu

Tham số truy vấn loại post

Tham số truy vấn bài viết theo trạng thái (Status)

Đây là các tham số để sử dụng khi cần lấy danh sách các bài viết theo trạng thái cái này thường sử dụng khi bạn code phần admin của WordPress hơn

publish,pending,draft,auto-draft, future, private, inherit, trash, any

Tham số truy vấn bài viết theo bình luận

Tham số truy vấn bài viết theo phân trang

// Truy vấn theo số post trên một trang

$query = new WP_Query( array( ‘posts_per_page’ => 3 ) );

$query = new WP_Query( array( ‘posts_per_page’ => -1 ) );

// Truy vấn không phân trang

$query = new WP_Query( array( ‘nopaging’ => true ) );

// Truy vấn theo số trang cụ thể

$query = new WP_Query( array( ‘offset’ => 3 ) );

// Truy vấn theo số trang cụ thể cũng như số post trên mỗi trang cụ thể.

$query = new WP_Query( array( ‘posts_per_page’ => 5, ‘offset’ => 3 ) );

$query = new WP_Query( array( ‘paged’ => get_query_var( ‘paged’ ) ) );

Trên Page tĩnh hoặc page template thì dùng đoạn sau

$paged = ( get_query_var(‘page’) ) ? get_query_var(‘page’) : 1;
$query = new WP_Query( array( ‘paged’ => $paged ) );

Tham số truy vấn bài viết theo thứ tự sắp xếp

Khi bạn muốn truy vấn các bài viết theo thứ tự sắp xếp theo điều kiện mà bạn mong muốn thì bạn có thể sử dụng các query sau.

$args = array(
‘orderby’ => ‘title’,
‘order’ => ‘DESC’,
);
$query = new WP_Query( $args );

$args = array(
‘orderby’ => ‘menu_order title’,
‘order’ => ‘DESC’,
);
$query = new WP_Query( $args );

$args = array(
‘orderby’ => ‘rand’,
‘posts_per_page’ => 1,

);
$query = new WP_Query( $args );

Show post phổ biến bằng comment

$args = array(
‘orderby’ => ‘comment_count’
);
$query = new WP_Query( $args );

Show post theo custon fields

$args = array(
‘post_type’ => ‘product’,
‘orderby’ => ‘meta_value_num’,
‘meta_key’ => ‘price’,
);
$query = new WP_Query( $args );

$args = array(
‘orderby’ => array( ‘title’ => ‘DESC’, ‘menu_order’ => ‘ASC’ )
);
$query = new WP_Query( $args );

$args = array(
‘orderby’ => array( ‘meta_value_num’ => ‘DESC’, ‘title’ => ‘ASC’ ),
‘meta_key’ => ‘age’
);
$query = new WP_Query( $args );

$args = array(
‘post_type’ => ‘my_custom_post_type’,
‘meta_key’ => ‘age’,
‘orderby’ => ‘meta_value_num’,
‘order’ => ‘ASC’,
‘meta_query’ => array(
array(
‘key’ => ‘age’,
‘value’ => array( 3, 4 ),
‘compare’ => ‘IN’,
),
),
);
$query = new WP_Query( $args );

$q = new WP_Query( array(
‘meta_query’ => array(
‘relation’ => ‘AND’,
‘state_clause’ => array(
‘key’ => ‘state’,
‘value’ => ‘Wisconsin’,
),
‘city_clause’ => array(
‘key’ => ‘city’,
‘compare’ => ‘EXISTS’,
),
),
‘orderby’ => array(
‘city_clause’ => ‘ASC’,
‘state_clause’ => ‘DESC’,
),
) );

Tham số truy vấn bài viết theo thời gian

Khi muốn truy vấn bài viết theo mốc thời gian mà bạn mong muốn.

$query = new WP_Query( ‘year=2012&monthnum=12&day=12’ );

$args = array(
‘date_query’ => array(
array(
‘year’ => 2012,
‘month’ => 12,
‘day’ => 12,
),
),
);
$query = new WP_Query( $args );

$today = getdate();
$query = new WP_Query( ‘year=’ . $today[‘year’] . ‘&monthnum=’ . $today[‘mon’] . ‘&day=’ . $today[‘mday’] );

$today = getdate();
$args = array(
‘date_query’ => array(
array(
‘year’ => $today[‘year’],
‘month’ => $today[‘mon’],
‘day’ => $today[‘mday’],
),
),
);
$query = new WP_Query( $args );

$week = date( ‘W’ );
$year = date( ‘Y’ );
$query = new WP_Query( ‘year=’ . $year . ‘&w=’ . $week );

$args = array(
‘date_query’ => array(
array(
‘year’ => date( ‘Y’ ),
‘week’ => date( ‘W’ ),
),
),
);
$query = new WP_Query( $args );

$args = array(
‘date_query’ => array(
array(
‘hour’ => 9,
‘compare’ => ‘>=’,
),
array(
‘hour’ => 17,
‘compare’ => ‘<=’,
),
array(
‘dayofweek’ => array( 2, 6 ),
‘compare’ => ‘BETWEEN’,
),
),
‘posts_per_page’ => -1,
);
$query = new WP_Query( $args );

$args = array(
‘date_query’ => array(
array(
‘after’ => ‘January 1st, 2013’,
‘before’ => array(
‘year’ => 2013,
‘month’ => 2,
‘day’ => 28,
),
‘inclusive’ => true,
),
),
‘posts_per_page’ => -1,
);
$query = new WP_Query( $args );

$args = array(
‘date_query’ => array(
array(
‘column’ => ‘post_date_gmt’,
‘before’ => ‘1 year ago’,
),
array(
‘column’ => ‘post_modified_gmt’,
‘after’ => ‘1 month ago’,
),
),
‘posts_per_page’ => -1,
);
$query = new WP_Query( $args );

Tham số truy vấn bài đăng bằng Custom Field

Bạn cũng có thể truy vấn để lấy các bài đăng bẳng Custom Field và với kiểu truy vấn này bạn vẫn có thể dùng các biểu thức logic.

Tham số truy vấn bài đăng bằng quyền user

Khi bạn muốn hiển thị các bài đăng thuộc quyền của một user nào đó bạn có thể sử dụng query này để truy vấn bài đăng đó.

Chuẩn hóa dữ liệu đầu vào và ra trong WordPress

Dữ liệu đầu vào rất quan trọng đối với một website, nó có thể trở thành mối nguy hiểm đối với website của bạn nếu bạn không kiểm tra dữ liệu và chuẩn hóa trước khi cho phép lưu trữ. Minh đã gặp trường hợp nhiều bạn nói rằng theme tự viết của bạn ấy kém an toàn và thường xuyên có dữ liệu lạ,… WordPress không phải là một CMS kém bảo mật, độ bảo mật của nó cũng xếp hạng tốt, tuy nhiên tốt đến đâu cũng là do cách dùng của người dùng và admin. Trong bài viết này mình sẽ chia sẻ với bạn cách để làm wordpress trở nên an toàn hơn bằng cách chuẩn hóa dữ liệu đầu vào.

Chuẩn hóa dữ liệu (sanitize) là gì?

Chuẩn hóa dữ liệu là quá trình làm “sạch” dữ liệu không liên quan đến loại cần chuẩn hóa. Ví dụ mình muốn chuẩn hóa một chuỗi ký tự nhập vào theo loại “Text” thì dữ liệu ban đầu có các mã HTML, Javascript,… sẽ được loại bỏ để cho ra một đoạn text chuẩn. Phương pháp chuẩn hóa không những giúp lưu trữ dữ liệu an toàn mà còn giúp tiết kiệm được dung lượng dư thừa do không phải lưu trữ nhiều ký tự không cần thiết.

Nếu dữ liệu ban đầu của bạn có quá nhiều và chưa được chuẩn hóa bạn có thể sử dụng phương pháp chuẩn hóa đầu ra (escape) để lấy dữ liệu ra an toàn mà không phá vỡ cấu trúc và hoạt động bình thường của website.

Dưới đây mình sẽ chia sẻ về cách sử dụng một số hàm chuẩn hóa đầu vào và ra của WordPress.

Các hàm chuẩn hóa dữ liệu đầu vào của WordPress
Mình thường sử dụng các hàm chuẩn hóa dữ liệu đầu vào khi thực hiện tạo Metabox, hoặc các form nhập liệu ở theme. Một số hàm thường dùng như sau:

  • sanitize_email($email): Hàm chuẩn hóa Email, với hàm này nó sẽ loại bỏ các ký tự ra hoặc ngoài cấu trúc của Email để lấy được một chuỗi Email hoàn chỉnh, ví dụ như sau:

  • sanitize_file_name($name): Hàm chuẩn hóa tên file, thay thế khoảng trống thành dấu gạch ngan, loại bỏ các ký tự đặt biệt không được chấp nhận trong file. Ví dụ như sau:

  • sanitize_html_class(): Hàm chuẩn hóa lớp html, hàm này có thể ít được dùng, ví dụ như sau:

  • sanitize_key($key): Hàm lọc đưa ra chữ thường (không in hoa), số, gạch ngan và dấu gạch dưới, Ví dụ như sau:

  • sanitize_mime_type($mime_type): Hàm lọc tên của một tệp và đưa ra loại tên tệp phù hợp nhất, ví dụ:

  • sanitize_text_field($str): Hàm giúp chuyển các ký tự “<“, loại bỏ các tab, khoản trống thừa và ngắt dòng.

  • sanitize_title_for_query($title): Được sử dụng để truy vấn cơ sở dữ liệu cho một giá trị từ URL.
  • sanitize_title_with_dashes($title, $unused, $context = ‘display’): Giới hạn đầu ra thành các ký tự chữ và số, dấu gạch dưới (_) và dấu gạch ngang (-). Khoảng trắng trở thành dấu gạch ngang.

và một số hàm khác bạn có thể tham khảo tại codex.wordpress.org.

Các hàm chuẩn hóa dữ liệu đầu ra của WordPress

Thật ra khi đã chuẩn hóa tốt đầu vào thì đầu ra không cần chuẩn hóa cũng được, thế nhưng đôi khi mọi thứ không thể suôn sẻ được nên chúng ta có thể sẽ có sai sót trong quá trình chuẩn hóa đầu vào. Vậy nên chuẩn hóa đầu ra cũng là một trong những cách làm được khuyến khích để giữ giao diện được an toàn hơn. Dưới đây là một số hàm chuẩn hóa dữ liệu đầu ra cơ bản trong WordPress.

  • esc_html(): Sử dụng hàm này để chuẩn hóa HTML trước khi hiển thị ra bên ngoài.

  • esc_url(): Sử dụng hàm này trước khi in ra một URL cho các thuộc tính src hay href cho các thẻ HTML.
  • esc_js(): Sử dụng để chuẩn hóa mã các đoạn mã javascript.

  • esc_attr(): Hãy sử dụng hàm này trước khi bạn in ra bất kỳ một thứ gì đó vào các thuộc tính của thẻ HTML.

  • esc_textarea(): Giúp bạn mã hóa các đoạn văn bản trước khi nó được hiển thị trong thẻ textarea.

Thay đổi font-size content với jQuery

Trong dự án WordPress Blog Themes sắp tới, mình dự định sẽ làm chức năng thay đổi kích thước font chữ cho nội dung bài viết. Nên hôm nay sẽ viết luôn một bài hướng dẫn để sau nay dễ dàng sử dụng lại cho các dự án tiếp theo.

Để sử dụng jQuery thay đổi kích thước font chữ nội dung bài viết khá đơn giản, bạn có thể sử dụng đoạn jQuery sau:

Tuy nhiên, sự thay đổi này chỉ có tác dụng với trang hiện tại. Khi người dùng click sang trang khác, mọi thứ lại trở về như ban đầu. Mình cần đến một giải pháp toàn diện hơn:

Trên đây là một đoạn mã khá đơn giản để thực hiện thay đổi kích thước font chữ trong nội dung bài viết. Bạn có thể tham khảo đầy đủ đoạn code mình sử dụng ở dưới đây
HTML

SCSS

jQuery

Chúc bạn thành công!