Loại bỏ sticky posts khỏi vòng lặp WordPress

5 tháng ago, WordPress Themes, Views
Loại bỏ sticky posts khỏi vòng lặp WordPress

Giới thiệu về Sticky Posts trong WordPress

Sticky posts, hay còn gọi là bài viết dính, là một tính năng hữu ích của WordPress cho phép bạn ghim một hoặc nhiều bài viết quan trọng lên đầu trang blog của mình. Điều này đảm bảo rằng những bài viết đó luôn được hiển thị nổi bật, thu hút sự chú ý của người đọc ngay khi họ truy cập trang web của bạn. Sticky posts thường được sử dụng để giới thiệu nội dung quan trọng, thông báo quan trọng, hoặc quảng cáo đặc biệt.

Tuy nhiên, trong một số trường hợp, bạn có thể muốn loại bỏ sticky posts khỏi vòng lặp (loop) chính của WordPress. Điều này có nghĩa là sticky posts vẫn sẽ được ghim trên đầu trang, nhưng chúng sẽ không xuất hiện lặp lại trong danh sách các bài viết thông thường trên trang chủ, trang lưu trữ, hoặc các trang danh mục. Việc loại bỏ sticky posts khỏi vòng lặp có thể giúp trang web của bạn trông gọn gàng hơn và tránh gây nhầm lẫn cho người dùng.

Bài viết này sẽ hướng dẫn bạn các phương pháp khác nhau để loại bỏ sticky posts khỏi vòng lặp WordPress, từ việc sử dụng các hàm tích hợp sẵn của WordPress đến việc chỉnh sửa code trong theme của bạn.

Tại sao cần loại bỏ Sticky Posts khỏi vòng lặp?

Có nhiều lý do tại sao bạn có thể muốn loại bỏ sticky posts khỏi vòng lặp WordPress:

  • Tránh lặp lại nội dung: Sticky posts đã được hiển thị ở vị trí nổi bật trên đầu trang, việc hiển thị chúng một lần nữa trong vòng lặp có thể gây lặp lại và làm phiền người dùng.
  • Cải thiện trải nghiệm người dùng: Loại bỏ sticky posts khỏi vòng lặp giúp trang web của bạn trông gọn gàng và dễ điều hướng hơn. Người dùng sẽ dễ dàng tìm thấy các bài viết mới hơn mà không bị phân tâm bởi các sticky posts.
  • Tối ưu hóa SEO: Mặc dù không có bằng chứng trực tiếp cho thấy sticky posts ảnh hưởng tiêu cực đến SEO, việc tránh lặp lại nội dung có thể giúp trang web của bạn tuân thủ các nguyên tắc của Google và cải thiện thứ hạng tìm kiếm.
  • Tùy chỉnh giao diện: Trong một số trường hợp, việc hiển thị sticky posts trong vòng lặp có thể làm hỏng thiết kế của trang web. Loại bỏ chúng giúp bạn có nhiều quyền kiểm soát hơn đối với giao diện của trang web.

Sử dụng Hàm `pre_get_posts` để loại bỏ Sticky Posts

Hàm `pre_get_posts` là một hook mạnh mẽ trong WordPress cho phép bạn sửa đổi các truy vấn (queries) trước khi chúng được thực thi. Chúng ta có thể sử dụng hàm này để loại bỏ sticky posts khỏi vòng lặp chính.

Để thực hiện việc này, hãy thêm đoạn code sau vào file `functions.php` của theme (hoặc child theme) của bạn:


function remove_sticky_posts_from_loop( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'ignore_sticky_posts', 1 );
    }
}
add_action( 'pre_get_posts', 'remove_sticky_posts_from_loop' );

Đoạn code này hoạt động như sau:

  • Hàm `remove_sticky_posts_from_loop` được gọi trước khi WordPress thực thi một truy vấn.
  • `$query->is_home()` kiểm tra xem truy vấn có phải là truy vấn cho trang chủ hay không.
  • `$query->is_main_query()` đảm bảo rằng chúng ta chỉ sửa đổi truy vấn chính (không phải các truy vấn phụ như widget hoặc các khu vực khác).
  • `$query->set( ‘ignore_sticky_posts’, 1 )` hướng dẫn WordPress bỏ qua sticky posts trong truy vấn này.
  • `add_action( ‘pre_get_posts’, ‘remove_sticky_posts_from_loop’ )` kết nối hàm `remove_sticky_posts_from_loop` với hook `pre_get_posts`.

Lưu ý: Nếu bạn muốn loại bỏ sticky posts khỏi vòng lặp trên các trang lưu trữ hoặc trang danh mục, bạn có thể thay đổi điều kiện `$query->is_home()` thành `$query->is_archive()` hoặc `$query->is_category()`.

Sử dụng Conditional Tags để loại bỏ Sticky Posts trên các trang cụ thể

Conditional tags là các hàm trong WordPress cho phép bạn kiểm tra xem trang hiện tại có thuộc một loại cụ thể nào đó hay không. Chúng ta có thể sử dụng conditional tags kết hợp với hàm `pre_get_posts` để loại bỏ sticky posts khỏi vòng lặp trên các trang cụ thể.

Ví dụ, để loại bỏ sticky posts khỏi vòng lặp trên trang chủ và trang danh mục, bạn có thể sử dụng đoạn code sau:


function remove_sticky_posts_from_loop( $query ) {
    if ( ( $query->is_home() || $query->is_category() ) && $query->is_main_query() ) {
        $query->set( 'ignore_sticky_posts', 1 );
    }
}
add_action( 'pre_get_posts', 'remove_sticky_posts_from_loop' );

Trong đoạn code này, `||` là toán tử OR, có nghĩa là điều kiện sẽ đúng nếu truy vấn là cho trang chủ hoặc trang danh mục.

Một số conditional tags phổ biến khác mà bạn có thể sử dụng:

  • `is_front_page()`: Kiểm tra xem trang hiện tại có phải là trang chủ (front page) hay không.
  • `is_page()`: Kiểm tra xem trang hiện tại có phải là một trang đơn (page) hay không.
  • `is_single()`: Kiểm tra xem trang hiện tại có phải là một bài viết đơn (single post) hay không.
  • `is_tag()`: Kiểm tra xem trang hiện tại có phải là một trang thẻ (tag) hay không.
  • `is_search()`: Kiểm tra xem trang hiện tại có phải là trang tìm kiếm hay không.

Chỉnh sửa Template Files để loại bỏ Sticky Posts

Một cách khác để loại bỏ sticky posts khỏi vòng lặp là chỉnh sửa trực tiếp các template files của theme của bạn. Cách này phức tạp hơn so với việc sử dụng hàm `pre_get_posts`, nhưng nó có thể cung cấp cho bạn nhiều quyền kiểm soát hơn đối với cách hiển thị nội dung.

Để thực hiện việc này, bạn cần xác định template file nào chịu trách nhiệm hiển thị vòng lặp mà bạn muốn loại bỏ sticky posts. Thông thường, đó sẽ là file `index.php`, `home.php`, `archive.php`, hoặc `category.php` trong theme của bạn.

Sau khi bạn đã xác định được template file, hãy mở nó và tìm vòng lặp WordPress. Vòng lặp thường có dạng:


<?php if ( have_posts() ) : ?>
    <?php while ( have_posts() ) : the_post(); ?>
        <!-- Hiển thị nội dung bài viết -->
    <?php endwhile; ?>
<?php endif; ?>

Để loại bỏ sticky posts khỏi vòng lặp, bạn có thể thêm một điều kiện để kiểm tra xem bài viết hiện tại có phải là một sticky post hay không. Nếu bài viết là một sticky post, bạn sẽ bỏ qua nó.

Ví dụ, bạn có thể thêm đoạn code sau vào bên trong vòng lặp:


<?php if ( is_sticky() ) continue; ?>

Hàm `is_sticky()` trả về true nếu bài viết hiện tại là một sticky post, và `continue` sẽ bỏ qua bài viết đó và tiếp tục với bài viết tiếp theo trong vòng lặp.

Lưu ý: Chỉnh sửa trực tiếp các template files của theme có thể gây ra các vấn đề nếu bạn không cẩn thận. Bạn nên tạo một child theme trước khi thực hiện bất kỳ thay đổi nào.

Sử dụng Plugin để loại bỏ Sticky Posts

Nếu bạn không muốn chỉnh sửa code hoặc sử dụng các hàm của WordPress, bạn có thể sử dụng một plugin để loại bỏ sticky posts khỏi vòng lặp. Có rất nhiều plugin miễn phí và trả phí trên WordPress.org có thể giúp bạn thực hiện việc này.

Để tìm một plugin phù hợp, hãy tìm kiếm trên WordPress.org với các từ khóa như “remove sticky posts from loop” hoặc “ignore sticky posts”.

Khi bạn đã tìm thấy một plugin phù hợp, hãy cài đặt và kích hoạt nó. Sau đó, làm theo hướng dẫn của plugin để cấu hình nó và loại bỏ sticky posts khỏi vòng lặp.

Một số plugin phổ biến để quản lý sticky posts:

  • Sticky Posts Toggle: Cho phép bạn dễ dàng biến bất kỳ bài viết nào thành sticky post hoặc bỏ ghim nó.
  • WP Sticky Menu: (Mặc dù tên là menu, nhưng một số tính năng có thể liên quan đến việc quản lý hiển thị sticky elements).
  • Advanced Post Types Order: Mặc dù tập trung vào việc sắp xếp bài viết, plugin này có thể cung cấp các tùy chọn để kiểm soát hiển thị của sticky posts.

Kết luận

Loại bỏ sticky posts khỏi vòng lặp WordPress là một cách hữu ích để cải thiện trải nghiệm người dùng và tối ưu hóa trang web của bạn. Bạn có thể sử dụng các phương pháp khác nhau để thực hiện việc này, từ việc sử dụng các hàm tích hợp sẵn của WordPress đến việc chỉnh sửa code trong theme của bạn hoặc sử dụng một plugin.

Hãy chọn phương pháp phù hợp nhất với kỹ năng và nhu cầu của bạn. Nếu bạn không quen thuộc với việc chỉnh sửa code, bạn nên sử dụng một plugin. Nếu bạn thoải mái với code, bạn có thể sử dụng hàm `pre_get_posts` hoặc chỉnh sửa template files của theme của bạn.

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