Hiển thị số lượng bài đăng khác nhau trên mỗi trang tùy thuộc vào ngữ cảnh (ví dụ: trang chủ, tìm kiếm, lưu trữ)


21

Trong Cài đặt Đọc, có nơi đặt số lượng bài đăng được hiển thị ảnh hưởng đến số lượng bài đăng được hiển thị trong tất cả các ngữ cảnh. Thay vào đó, tôi muốn hiển thị một số bài đăng nhất định trên trang chủ và một số bài đăng khác trên các trang như lưu trữ, kết quả tìm kiếm, v.v.

đọc-cài đặt-blog-trang-hiển thị-nhiều nhất trên mỗi trang

Tôi nhận ra rằng tôi có thể làm điều này bằng cách chỉnh sửa các tệp chủ đề và thay đổi các tham số truy vấn ở đó, nhưng tôi muốn truy cập dễ dàng hơn vào một trang cài đặt đơn giản. Cách đây rất lâu, tôi đã bắt gặp một plugin đã làm điều này, nhưng tôi không thể tìm thấy nó ngay bây giờ.

Có ai biết một plugin để làm điều này, hoặc thậm chí là một chức năng mà tôi có thể đặt trong hàm.php để thực hiện điều tương tự không?


Có lẽ bạn đang nghĩ về plugin 'Các bài viết khác nhau trên mỗi trang' của @ chip-bennett: chipbennett.net/plugins/cbnet-different-posts-per-page thực hiện những gì bạn muốn theo cách đồ họa.
Tom Auger

Câu trả lời:


23

Tôi tin rằng cách tốt nhất để làm điều này trong một plugin là chạy chức năng mẫu sau đây khi pre_get_postsgặp hook hook hành động. Đối $wp_querytượng có sẵn, nghĩa là các thẻ điều kiện của bạn có sẵn, nhưng trước khi WordPress có bài đăng, điều đó có nghĩa là bạn đang thay đổi các vars truy vấn trước khi truy vấn đầu tiên được chạy, thay vì thêm truy vấn thứ hai như khi query_posts () được sử dụng trong một chủ đề tập tin.

function custom_posts_per_page($query) {
    if (is_home()) {
        $query->set('posts_per_page', 8);
    }
    if (is_search()) {
        $query->set('posts_per_page', -1);
    }
    if (is_archive()) {
        $query->set('posts_per_page', 25);
    } //endif
} //function

//this adds the function above to the 'pre_get_posts' action     
add_action('pre_get_posts', 'custom_posts_per_page');

Tôi sử dụng chức năng này trên trang web của riêng tôi. Thật dễ dàng để cắt và dán nó ở đây cho bạn.
kevtrout

0

bạn có thể thực hiện một vòng lặp tùy chỉnh bằng query_posts và chỉ định số lượng bài viết theo is_home, is_archive, v.v.

chỉ là một câu lệnh if đơn giản cùng với query_posts


Vâng, tôi đã đề cập đến điều đó trong câu hỏi của tôi. Tôi đang tìm cách để làm điều đó vì vậy tôi không phải chỉnh sửa nhiều tệp chủ đề để thay đổi cài đặt. Cảm ơn.
Doug

1
Đó là ý tưởng khá tồi để làm theo cách này. WordPress đã chạy truy vấn. Nếu bạn đặt query_poststrong chủ đề của mình, bạn sẽ bỏ qua truy vấn ban đầu và thực hiện một truy vấn khác, dự phòng.
Krzysiek Dróżdż

-1

Để thêm vào câu hỏi này. Có ai biết cách xác định post_per_page cho hàm chức năng này custom_posts_per_page ($ query) nếu thêm trang mới vào index.php như thế này:

<?php
if ($_GET['new'] == 1) 
{
    include ( TEMPLATEPATH . '/newpage.php' );
    exit;
}
?>

-1

Tôi nhận ra rằng tôi có thể làm điều này bằng cách chỉnh sửa các tệp chủ đề và thay đổi các tham số truy vấn ở đó, nhưng tôi muốn truy cập dễ dàng hơn vào một trang cài đặt đơn giản.

Vì lợi ích của sự hoàn thiện, tôi thấy rằng query_postskết hợp với $query_stringghép nối hoạt động tốt.

Tôi đã đặt mã này vào index.php(chủ đề của tôi không có category.php) ...

<?php 
if (!is_front_page()) { 
    query_posts($query_string . "&posts_per_page=20"); 
}
?>

Tất nhiên những gì chúng tôi đang làm ở đây là sửa đổi chuỗi truy vấn nội bộ của vòng lặp, ghi đè số lượng bài đăng mặc định trên mỗi trang .

Nó hoạt động một điều trị để cung cấp một danh sách nhỏ hơn các bài đăng trên trang chủ nơi tôi đang hiển thị các bài đăng đầy đủ và một danh sách các bài đăng lớn hơn nhiều ở mọi nơi khác (danh mục, theo ngày, v.v.) trong đó tôi chỉ hiển thị tóm tắt bài đăng.

Tuy nhiên, xin lưu ý rằng không giống như câu trả lời được chấp nhận, điều này sẽ chạy truy vấn hai lần , vì vậy nó không phải là một giải pháp tốt đẹp.


Jeff, tôi đang tìm một nơi tập trung để kiểm soát số lượng bài viết được trả lại trong các bối cảnh khác nhau. Câu trả lời của bạn chỉ thực hiện điều đó nếu bạn sử dụng index.php để xử lý TẤT CẢ bối cảnh, điều mà hầu hết các chủ đề không làm được. Ngoài việc tăng các cuộc gọi đến cơ sở dữ liệu (ảnh hưởng đến hiệu suất), kỹ thuật của bạn cũng có thể thay đổi phản hồi thành các thẻ có điều kiện (ví dụ: is_home () hoặc is_front_page) theo những cách không mong muốn. Cuối cùng, nếu bạn muốn thêm các vòng lặp thứ cấp vào một trang, bạn KHÔNG nên sử dụng query_posts, mà sử dụng "WP_Query mới" thay vào đó (hoặc get_posts).
Doug

@doug đây không phải là vòng lặp thứ cấp, nó ghi đè lên vòng lặp chính - và vâng, chủ đề cụ thể này sử dụng index.php để hiển thị mọi thứ, nó khá tối giản. Tôi cảm thấy điều này có ý nghĩa hơn ở đây như một câu trả lời, nhưng nếu bạn muốn tôi có thể tự đặt câu hỏi và trả lời nếu câu trả lời này xúc phạm bạn theo một cách nào đó.
Jeff Atwood

Trên thực tế tôi đã đọc sai đoạn thứ hai đến cuối cùng của bạn và nghĩ rằng danh sách bài viết "lớn hơn" và "nhỏ hơn" nằm trên cùng một trang, vì vậy câu cuối cùng của tôi ở trên là không liên quan. Và vâng, việc đặt tất cả mã của bạn vào index.php là hoàn toàn hợp pháp nếu bạn muốn. Và nếu đó là trường hợp, thì phương pháp của bạn là một cách nhanh chóng và dễ dàng để làm điều này, vì vậy tôi sẽ xóa downvote của mình sau khi khóa 20 giờ kết thúc. Mặc dù vậy, việc gửi một truy vấn mới thay vì sửa đổi truy vấn ban đầu như trong câu trả lời của kevtrout là ít mong muốn hơn vì những lý do đã được đề cập (bởi bạn, tôi và WP Codex).
Doug
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.