Loại bỏ Sticky Posts khỏi Vòng Lặp WordPress
Trong thế giới WordPress, “sticky post” (bài viết nổi bật) là một tính năng mạnh mẽ cho phép bạn ghim một bài viết cụ thể lên đầu trang chủ hoặc các trang lưu trữ khác. Điều này rất hữu ích để thu hút sự chú ý đến nội dung quan trọng, tin tức nổi bật hoặc các thông báo đặc biệt. Tuy nhiên, trong một số trường hợp, bạn có thể muốn loại bỏ các sticky posts khỏi vòng lặp (loop) thông thường của WordPress, để chúng chỉ xuất hiện ở một vị trí được chỉ định hoặc để tạo ra một bố cục tùy chỉnh.
Tại sao cần loại bỏ Sticky Posts khỏi Vòng Lặp?
Có nhiều lý do để bạn muốn loại bỏ sticky posts khỏi vòng lặp mặc định:
- Thiết kế Tùy chỉnh: Bạn có thể muốn tạo một khu vực “Nổi bật” riêng biệt cho các sticky posts, thay vì trộn lẫn chúng với các bài viết thông thường.
- Tránh Lặp lại Nội dung: Nếu bạn hiển thị sticky posts ở một khu vực riêng, việc chúng xuất hiện lại trong vòng lặp thông thường có thể gây khó chịu và làm giảm trải nghiệm người dùng.
- Kiểm soát Bố cục: Loại bỏ sticky posts giúp bạn kiểm soát chính xác thứ tự và cách hiển thị nội dung trên trang web của mình.
Các Phương Pháp Loại Bỏ Sticky Posts
WordPress cung cấp một số phương pháp để loại bỏ sticky posts khỏi vòng lặp. Dưới đây là một số cách phổ biến nhất:
1. Sử dụng pre_get_posts Hook
pre_get_posts
là một hook mạnh mẽ cho phép bạn sửa đổi các truy vấn (queries) trước khi chúng được thực thi. Bạn có thể sử dụng hook này để loại bỏ các sticky posts khỏi vòng lặp chính.
Dưới đây là một ví dụ về cách sử dụng pre_get_posts
trong file functions.php
của theme:
function remove_sticky_posts_from_loop( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'post__not_in', get_option( 'sticky_posts' ) );
}
}
add_action( 'pre_get_posts', 'remove_sticky_posts_from_loop' );
Giải thích:
- Hàm
remove_sticky_posts_from_loop
nhận một đối tượng$query
làm tham số. - Chúng ta kiểm tra xem truy vấn có phải là truy vấn chính trên trang chủ hay không (
$query->is_home() && $query->is_main_query()
). Điều này đảm bảo rằng chúng ta chỉ loại bỏ sticky posts khỏi vòng lặp chính trên trang chủ. get_option( 'sticky_posts' )
trả về một mảng ID của các sticky posts.$query->set( 'post__not_in', get_option( 'sticky_posts' ) )
loại bỏ các bài viết có ID nằm trong mảng sticky posts khỏi truy vấn.add_action( 'pre_get_posts', 'remove_sticky_posts_from_loop' )
đăng ký hàm của chúng ta để chạy khi hookpre_get_posts
được kích hoạt.
Lưu ý: Phương pháp này chỉ ảnh hưởng đến trang chủ. Nếu bạn muốn loại bỏ sticky posts khỏi các trang lưu trữ khác (ví dụ: trang danh mục, trang thẻ), bạn cần điều chỉnh điều kiện if
cho phù hợp.
2. Sử dụng Query Filter (Thủ công)
Nếu bạn đang sử dụng một truy vấn tùy chỉnh để hiển thị bài viết (ví dụ: sử dụng WP_Query
), bạn có thể loại bỏ sticky posts bằng cách thêm tham số post__not_in
vào truy vấn của mình.
Ví dụ:
$sticky = get_option( 'sticky_posts' );
$args = array(
'post__not_in' => $sticky,
// Thêm các tham số truy vấn khác của bạn ở đây
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
// Hiển thị bài viết
}
wp_reset_postdata();
} else {
// Không có bài viết
}
Giải thích:
$sticky = get_option( 'sticky_posts' )
lấy mảng ID của các sticky posts.- Chúng ta tạo một mảng
$args
chứa các tham số truy vấn, bao gồm'post__not_in' => $sticky
để loại bỏ các sticky posts. - Chúng ta sử dụng
WP_Query
để thực hiện truy vấn với các tham số đã chỉ định. - Phần còn lại của mã là vòng lặp thông thường để hiển thị các bài viết.
3. Sử dụng Conditional Tags (Không khuyến khích cho vòng lặp chính)
Bạn có thể sử dụng conditional tags như is_sticky()
để kiểm tra xem một bài viết có phải là sticky post hay không và bỏ qua nó trong vòng lặp. Tuy nhiên, phương pháp này không hiệu quả bằng các phương pháp trên, đặc biệt là đối với vòng lặp chính, vì nó vẫn thực hiện truy vấn cho các sticky posts, chỉ là không hiển thị chúng.
Ví dụ (KHÔNG khuyến khích cho vòng lặp chính):
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
if ( ! is_sticky() ) {
// Hiển thị bài viết nếu nó không phải là sticky post
}
}
}
Hiển thị Sticky Posts ở một Khu vực Riêng
Sau khi loại bỏ sticky posts khỏi vòng lặp chính, bạn có thể muốn hiển thị chúng ở một khu vực riêng biệt. Dưới đây là một ví dụ về cách thực hiện:
$sticky = get_option( 'sticky_posts' );
if ( ! empty( $sticky ) ) {
$args = array(
'post__in' => $sticky,
'ignore_sticky_posts' => 1, // Bắt buộc cho trường hợp này
);
$sticky_query = new WP_Query( $args );
if ( $sticky_query->have_posts() ) {
echo '<div class="sticky-posts">';
echo '<h2>Bài viết Nổi bật</h2>';
while ( $sticky_query->have_posts() ) {
$sticky_query->the_post();
echo '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>';
// Thêm thông tin khác bạn muốn hiển thị
}
echo '</div>';
wp_reset_postdata();
}
}
Giải thích:
get_option( 'sticky_posts' )
lấy mảng ID của các sticky posts.- Chúng ta kiểm tra xem mảng
$sticky
có rỗng hay không (! empty( $sticky )
). - Chúng ta tạo một mảng
$args
chứa các tham số truy vấn, bao gồm'post__in' => $sticky
(chỉ lấy các sticky posts) và'ignore_sticky_posts' => 1
(bắt buộc để đảm bảo WordPress không loại bỏ các sticky posts này). - Chúng ta sử dụng
WP_Query
để thực hiện truy vấn. - Chúng ta lặp qua các sticky posts và hiển thị chúng trong một khu vực có class
.sticky-posts
.
Kết luận
Loại bỏ sticky posts khỏi vòng lặp WordPress là một kỹ thuật hữu ích để tạo ra các bố cục tùy chỉnh và kiểm soát cách nội dung được hiển thị trên trang web của bạn. Bằng cách sử dụng pre_get_posts
hook hoặc các truy vấn tùy chỉnh, bạn có thể dễ dàng loại bỏ sticky posts và hiển thị chúng ở một khu vực riêng biệt, mang lại trải nghiệm người dùng tốt hơn.