Làm thế nào để hiển thị một bài đăng trên trang nhất nhưng có phân trang bình thường?


9

Tôi muốn có một bài đăng trên trang nhất của tôi (luôn luôn là mới nhất), nhưng hãy để phân trang bình thường hoạt động. Vì vậy, trang đầu có bài 1, trang tiếp theo nên có bài 2-11 (1-10 cũng tốt), sau đó 12-21 hoặc 11-20, v.v. Tôi biết tôi có thể thay đổi số lượng bài đăng tùy theo ngữ cảnh , nhưng đặt mục này thành "1" trên trang chủ có nghĩa là các trang tiếp theo cũng chỉ hiển thị một bài đăng.

Vấn đề chính của tôi là /page/2/như vậy và trên các công trình, nhưng /page/1/luôn luôn chuyển hướng đến trang chủ thực sự /,. Điều này có nghĩa là bài viết 2-10 luôn bị bỏ qua, vì trang 2 hiển thị 11-20. Tôi hiện đang giải quyết điều này bằng cách liên kết với kho lưu trữ của tôi, nhưng điều này không lý tưởng khi bạn đến các bài đăng đầu tiên của năm và có ít bài đăng hơn và không có cách tiếp tục rõ ràng.

Câu trả lời:


7

Tôi giải quyết nó bằng các offsettham số truy vấn . Điều này cho phép tôi chỉnh sửa truy vấn trong pre_get_postshook và dường như là cách sạch nhất để thực hiện việc này mà không cần truy vấn mới. Bây giờ trang chủ chỉ hiển thị một bài đăng và page/2/hiển thị các bài đăng 2-11. Tất cả các liên kết tiếp tục hoạt động, không cần sửa đổi khác.

add_action('pre_get_posts', 'set_offset_on_front_page');
function _set_offset_on_front_page(&$query)
{
    if (is_front_page() && is_paged()) {
            $posts_per_page = isset($query->query_vars['posts_per_page']) ? $query->query_vars['posts_per_page'] : get_option('posts_per_page');
            // If you want to use 'offset', set it to something that passes empty()
            // 0 will not work, but adding 0.1 does (it gets normalized via absint())
            // I use + 1, so it ignores the first post that is already on the front page
            $query->query_vars['offset'] = (($query->query_vars['paged'] - 2) * $posts_per_page) + 1;
    }
}

Nếu điều này hoạt động, thì OP nên sử dụng điều này.
john010117

Mà tôi làm, bởi vì tôi đã viết câu hỏi và câu trả lời này. Nhưng cảm ơn bạn đã góp ý, họ đã đưa tôi đi đúng hướng.
Jan Fabry

Có khả năng để nó hoạt động trên archive.php hoặc category.php, chỉ hiển thị 2 bài đăng mới nhất trên trang 1 trong khi duy trì phân trang chính xác? Cảm ơn!
Amit

@Amit: Nếu bạn thay thế is_front_page()bằng is_archive()hoặc is_category(), tôi nghĩ bạn có thể đến nơi bạn cần.
Jan Fabry

3

Ok, có thể đây là một cách kỳ lạ hoặc phức tạp để làm điều này, nhưng tôi đã gặp một vấn đề tương tự (tôi muốn hiển thị một văn bản chào mừng và ba bài đăng mới nhất của một danh mục cụ thể trên trang nhất. Vì vậy, tôi đã làm:

  1. Tạo một trang mới gọi là nhà và đặt văn bản chào mừng của tôi trên đó.
  2. Vô hiệu hóa trang chủ mặc định và đặt trang chủ tùy chỉnh của tôi làm trang bắt đầu
  3. Tạo một mẫu trang mới (sao chép và sửa đổi)
    1. hãy để nó hiển thị thân trang
    2. tải ba bài viết mới nhất của thể loại X và hiển thị chúng
    3. có một liên kết "thêm" bên dưới nó liên kết trên / category / category-x /

trông như thế này: http://hinek.de (trang bằng tiếng Đức, xin lỗi)

Nếu đây có thể là cách cho bạn và bạn cần thêm thông tin hoặc mẫu mã cho mẫu trang, hãy bình luận và tôi sẽ chỉnh sửa bài đăng này.


Điều này hoạt động vì bạn chỉ hiển thị các bài đăng trong danh mục "Thông điệp của ... bất cứ điều gì" và do đó có thể đi đến trang danh mục đó và sử dụng phân trang thông thường. Tôi muốn hiển thị các bài đăng từ tất cả các danh mục, vì vậy phương pháp này sẽ không hiệu quả với tôi. Bạn không có nơi nào mọi người có thể duyệt qua tất cả các bài viết từ tất cả các loại?
Jan Fabry

1

Tôi đang giả sử bạn đang chạy Wordpress 3.0.x?

Để chỉ hiển thị một bài đăng (trong bất kỳ danh mục nào) trên trang đầu là dễ dàng. Sử dụng query_posts('post_per_page=1')trong home.phptập tin của bạn thay vì gọi get_template_part('loop').

Để làm theo các phương pháp phân trang bình thường sau đó là một chút khó khăn. Trong loop.phptệp của bạn , tôi khuyên bạn nên đặt <?php global $paged; ?>trước <?php if (have_posts()) : ?>câu lệnh và sử dụng $pagedbiến và query_posts()hàm để sửa đổi truy vấn của bạn để nó hiển thị đúng bài viết.

Tệp của bạn loop.phpsẽ trông giống như thế này (lưu ý: không được kiểm tra):

<?php
global $paged;

if (!is_front_page() && $paged && $post->post_type == 'post') :
    query_posts('posts_per_page=10&paged=' . ($paged - 1));
    if (have_posts()) :
        while (have_posts()) : the_post();
        // Rest of the loop
        endwhile;
    endif;
endif;
?>

Tôi đã sử dụng $paged - 1đơn giản vì trang 2 sẽ hiển thị các bài đăng 1 - 10 và trang 3 sẽ hiển thị các bài đăng 11 - 20, v.v.


Thay đổi pagedtham số sẽ không phá vỡ bất cứ điều gì khác, như next_posts_link? Có lẽ tốt hơn là sửa đổi truy vấn trong pre_get_postshook, vì vậy tôi không tạo một truy vấn mới? Và vâng, đây là WP 3.
Jan Fabry

AFAIK, nó không ảnh hưởng next_posts_link. Tất nhiên, cách duy nhất để tìm hiểu là thực sự thử nó.
john010117

1
Argh, nếu tôi cố gắng chỉnh sửa pagedtham số trong pre_get_postshook, hãy redirect_canonicalkhởi động và muốn thay thế url bằng pagedtham số mới . Tôi có thể vô hiệu hóa chuyển hướng trong trường hợp này, nhưng next_posts_linksử dụng $pagedbiến toàn cục được đặt thành giá trị mới, nhưng tôi không biết mã nào, vì vậy nó không chính xác.
Jan Fabry

Bạn đã thực sự thử sử dụng mã của tôi và xem nếu nó hoạt động? Tôi không quá quen thuộc với pre_get_postscái móc, vì vậy tôi không thể giúp được gì nhiều. Ngoài ra, hãy thử sửa đổi $pagedbiến trực tiếp (ví dụ $paged = $paged - 1):) nếu bạn lo lắng next_posts_link().
john010117

0

Câu hỏi này hơi cũ, nhưng đối với những người tìm thấy điều này trong thời kỳ hiện đại, bạn không bao giờ nên gọi query_posts . Từ bộ mã Wordpress:

query_posts () là cách quá đơn giản và có vấn đề để sửa đổi truy vấn chính của trang bằng cách thay thế nó bằng phiên bản mới của truy vấn. Đó là không hiệu quả (chạy lại các truy vấn SQL) và sẽ hoàn toàn thất bại trong một số trường hợp (đặc biệt là thường xuyên khi xử lý phân trang bài viết).

...

TL; DR không sử dụng query_posts () bao giờ;

Thay vào đó, bạn nên sử dụng pre_get_postshook trong hàm.php như sau:

function hwl_home_pagesize( $query ) {
    // Behave normally for secondary queries
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( is_home() ) {
        // Display only 1 post for the home page
        $query->set( 'posts_per_page', 1 );
        return;
    }

    // Otherwise, use whatever is set in the Wordpress Admin screen
    $query->set( 'posts_per_page', get_option('posts_per_page'); );
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

Tuy nhiên, hãy cẩn thận rằng trong một số trường hợp, (chẳng hạn như điều chỉnh độ lệch bài), sử dụng pre_get_postsmóc có thể xáo trộn phân trang của bạn. Khắc phục sự cố này không quá khó, nhưng đó là điều cần chú ý. Có một ví dụ về cách khắc phục điều này ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.