Thêm sticky posts vào custom post type archives WordPress
Giới thiệu về Sticky Posts và Custom Post Types trong WordPress
Trong WordPress, “Sticky Posts” (bài viết dính) là những bài viết được ưu tiên hiển thị lên trên cùng của trang chủ blog, bất kể thời gian đăng tải của chúng. Tính năng này rất hữu ích để làm nổi bật những thông tin quan trọng, bài viết giới thiệu, hoặc các nội dung evergreen. Tuy nhiên, mặc định, tính năng sticky posts chỉ hoạt động trên trang chủ blog (thường là hiển thị bài viết theo định dạng blog). Nếu bạn sử dụng Custom Post Types (CPTs), bạn có thể muốn mở rộng chức năng này để hiển thị các “sticky” phiên bản của CPTs trên các trang lưu trữ (archive) của chúng.
Custom Post Types là một tính năng mạnh mẽ cho phép bạn tạo ra các loại nội dung khác nhau ngoài bài viết và trang thông thường. Ví dụ, bạn có thể tạo CPT “Sản phẩm”, “Dự án”, “Sự kiện”, v.v. Mỗi CPT có thể có các trường dữ liệu riêng (custom fields) và giao diện quản lý riêng. Khi bạn tạo một CPT, WordPress tự động tạo ra một trang lưu trữ để hiển thị danh sách các bài viết thuộc CPT đó. Bài viết này sẽ hướng dẫn bạn cách thêm chức năng sticky posts vào các trang lưu trữ của Custom Post Types.
Tại sao cần thêm Sticky Posts vào Custom Post Type Archives?
Việc thêm sticky posts vào trang lưu trữ của CPT mang lại nhiều lợi ích:
- Làm nổi bật nội dung quan trọng: Giúp bạn dễ dàng làm nổi bật các sản phẩm, dự án, hoặc sự kiện quan trọng trên trang lưu trữ của CPT tương ứng.
- Cải thiện trải nghiệm người dùng: Người dùng có thể nhanh chóng tìm thấy các nội dung được ưu tiên hàng đầu, giúp họ dễ dàng điều hướng và tìm kiếm thông tin.
- Tăng cường khả năng điều hướng: Tạo ra một hệ thống điều hướng rõ ràng hơn, giúp người dùng dễ dàng tiếp cận các nội dung chính mà bạn muốn giới thiệu.
Các bước thực hiện
Để thêm sticky posts vào Custom Post Type archives, chúng ta sẽ cần thực hiện các bước sau:
- Lấy danh sách các sticky posts của CPT.
- Lấy danh sách các bài viết thông thường của CPT.
- Kết hợp hai danh sách, ưu tiên sticky posts ở trên.
- Hiển thị danh sách kết hợp trên trang lưu trữ.
Chi tiết thực hiện: Sử dụng `pre_get_posts`
Phương pháp phổ biến và hiệu quả nhất để thêm sticky posts vào CPT archives là sử dụng hook `pre_get_posts`. Hook này cho phép bạn can thiệp và sửa đổi truy vấn WordPress trước khi nó được thực thi. Điều này cho phép chúng ta tùy chỉnh cách các bài viết được truy xuất và hiển thị trên trang lưu trữ.
Dưới đây là đoạn code PHP bạn có thể thêm vào file `functions.php` của theme (hoặc một plugin tùy chỉnh):
function my_custom_sticky_posts( $query ) {
// Kiểm tra nếu đây là trang lưu trữ của Custom Post Type
if ( ! is_admin() && $query->is_main_query() && is_post_type_archive( 'your_custom_post_type' ) ) {
// Lấy danh sách các sticky posts
$sticky_posts = get_option( 'sticky_posts' );
// Đảm bảo có sticky posts
if ( ! empty( $sticky_posts ) ) {
// Truy vấn các sticky posts cho Custom Post Type
$args = array(
'post_type' => 'your_custom_post_type',
'post__in' => $sticky_posts,
'ignore_sticky_posts' => 1, // Loại bỏ sticky posts khỏi truy vấn chính
);
$sticky_query = new WP_Query( $args );
// Lấy danh sách ID của các sticky posts đã truy vấn
$sticky_posts_ids = array();
if ( $sticky_query->have_posts() ) {
while ( $sticky_query->have_posts() ) {
$sticky_query->the_post();
$sticky_posts_ids[] = get_the_ID();
}
wp_reset_postdata();
}
// Loại bỏ các sticky posts khỏi truy vấn chính
$query->set( 'post__not_in', $sticky_posts_ids );
// Kết hợp ID của sticky posts và truy vấn hiện tại
$posts_array = array_merge( $sticky_posts_ids, $query->posts );
// Sắp xếp lại các bài viết
$query->posts = $posts_array;
// Thiết lập lại số lượng bài viết
$query->post_count = count( $posts_array );
}
}
}
add_action( 'pre_get_posts', 'my_custom_sticky_posts' );
Giải thích code:
- `is_post_type_archive( ‘your_custom_post_type’ )`: Kiểm tra xem truy vấn hiện tại có phải là trang lưu trữ của Custom Post Type `your_custom_post_type` hay không. Thay thế `your_custom_post_type` bằng slug của Custom Post Type của bạn.
- `get_option( ‘sticky_posts’ )`: Lấy danh sách các ID của các sticky posts từ database.
- `WP_Query`: Sử dụng `WP_Query` để truy vấn các sticky posts thuộc Custom Post Type.
- `ignore_sticky_posts’ => 1`: Loại bỏ sticky posts khỏi truy vấn mặc định để tránh trùng lặp.
- `post__not_in`: Loại bỏ các sticky posts đã truy vấn khỏi truy vấn chính để tránh hiển thị chúng hai lần.
- `array_merge`: Kết hợp mảng ID của các sticky posts và mảng các bài viết thông thường.
- `$query->posts` và `$query->post_count`: Cập nhật mảng `$posts` và `$post_count` của truy vấn để phản ánh sự thay đổi.
Quan trọng: Hãy nhớ thay thế `your_custom_post_type` bằng slug thực tế của Custom Post Type mà bạn muốn áp dụng chức năng này.
Cách khác: Sử dụng hai truy vấn riêng biệt
Một cách tiếp cận khác là sử dụng hai truy vấn riêng biệt: một cho sticky posts và một cho các bài viết thông thường. Cách này có thể dễ hiểu hơn đối với một số người, nhưng có thể kém hiệu quả hơn về mặt hiệu năng nếu bạn có nhiều sticky posts.
Bạn cần sửa đổi template file cho trang lưu trữ của Custom Post Type của bạn (thường là `archive-your_custom_post_type.php`).
<?php
// Truy vấn các sticky posts
$sticky_posts = get_option( 'sticky_posts' );
$args = array(
'post_type' => 'your_custom_post_type',
'post__in' => $sticky_posts,
'ignore_sticky_posts' => 1,
);
$sticky_query = new WP_Query( $args );
// Hiển thị sticky posts
if ( $sticky_query->have_posts() ) {
echo '<h2>Sticky Posts</h2>';
while ( $sticky_query->have_posts() ) {
$sticky_query->the_post();
get_template_part( 'template-parts/content', get_post_type() ); // Hoặc sử dụng the_title(), the_content(), v.v.
}
wp_reset_postdata();
}
// Truy vấn các bài viết thông thường
$args = array(
'post_type' => 'your_custom_post_type',
'post__not_in' => $sticky_posts,
'paged' => ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1,
);
$query = new WP_Query( $args );
// Hiển thị các bài viết thông thường
if ( $query->have_posts() ) {
echo '<h2>Other Posts</h2>';
while ( $query->have_posts() ) {
$query->the_post();
get_template_part( 'template-parts/content', get_post_type() ); // Hoặc sử dụng the_title(), the_content(), v.v.
}
wp_reset_postdata();
// Phân trang
the_posts_pagination();
} else {
echo '<p>Không có bài viết nào.</p>';
}
?>
Giải thích code:
- Sử dụng `WP_Query` hai lần: một lần để truy vấn sticky posts và một lần để truy vấn các bài viết thông thường.
- `post__not_in`: Trong truy vấn bài viết thông thường, chúng ta loại trừ các ID của sticky posts để tránh trùng lặp.
- `the_posts_pagination()`: Sử dụng hàm này để hiển thị phân trang cho các bài viết thông thường.
- `get_template_part( ‘template-parts/content’, get_post_type() )`: Sử dụng template part để hiển thị nội dung của mỗi bài viết. Bạn có thể thay thế bằng các hàm hiển thị nội dung khác như `the_title()` và `the_content()`.
Quan trọng: Hãy nhớ thay thế `your_custom_post_type` bằng slug thực tế của Custom Post Type của bạn. Bạn cũng cần đảm bảo rằng template part `template-parts/content-your_custom_post_type.php` tồn tại hoặc thay thế bằng cách hiển thị nội dung phù hợp.
Xử lý các vấn đề thường gặp
Trong quá trình thực hiện, bạn có thể gặp phải một số vấn đề sau:
- Sticky posts không hiển thị: Kiểm tra kỹ xem bạn đã kích hoạt sticky posts cho các bài viết mong muốn hay chưa. Đảm bảo rằng slug của Custom Post Type được sử dụng chính xác trong code.
- Phân trang bị lỗi: Đảm bảo rằng bạn đã sử dụng hàm `the_posts_pagination()` chính xác. Kiểm tra xem tham số `paged` đã được truyền đúng cách hay chưa.
- Hiệu năng kém: Nếu bạn có nhiều sticky posts, cách sử dụng hai truy vấn có thể gây ra hiệu năng kém. Hãy thử sử dụng phương pháp `pre_get_posts` thay thế.
Kết luận
Việc thêm sticky posts vào trang lưu trữ của Custom Post Types là một cách tuyệt vời để làm nổi bật nội dung quan trọng và cải thiện trải nghiệm người dùng trên trang web WordPress của bạn. Bằng cách sử dụng hook `pre_get_posts` hoặc tạo hai truy vấn riêng biệt, bạn có thể dễ dàng thực hiện chức năng này. Hãy nhớ kiểm tra kỹ code và điều chỉnh nó cho phù hợp với cấu trúc và thiết kế của theme của bạn.
- Chống spam form liên hệ WordPress 9 cách
- Cách xóa version number WordPress đúng cách
- Thêm link “Read More” vào text copied WordPress
- Thay đổi số bài viết trang blog WordPress
- Thêm blogroll WordPress không cần plugin
- 3 cách thêm đường kẻ ngang trong WordPress
- Hướng dẫn tắt hoàn toàn bình luận WordPress
