it-swarm-vi.tech

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?

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/ và cứ thế hoạt động, nhưng /page/1/ luôn chuyển hướng đến trang chủ thực, /. Đ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 tại giải quyết vấn đề 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 những bài đăng đầu tiên trong năm và có ít bài đăng hơn và không có cách tiếp tục rõ ràng.

8
Jan Fabry

Tôi đã giải quyết nó bằng cách sử dụng tham số truy vấn offset . Điều này cho phép tôi chỉnh sửa truy vấn trong hook pre_get_posts 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;
    }
}
6
Jan Fabry

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 (được sao chép và sửa đổi) hiện có [.__.]
    1. để 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 dành 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.

3
Hinek

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 tệp home.php 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 tệp loop.php của bạn, tôi khuyên bạn nên đặt <?php global $paged; ?> trước câu lệnh <?php if (have_posts()) : ?> và sử dụng biến $paged và hàm query_posts() để sửa đổi truy vấn của bạn để nó hiển thị đúng bài đăng.

Tệp loop.php của bạn sẽ 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.

1
john010117

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 hook pre_get_posts 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 móc pre_get_posts có thể thu thập 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 sửa lỗi này tại đây .

0
lfalin