Pokaż inną liczbę postów na stronie w zależności od kontekstu (np. Strona główna, wyszukiwanie, archiwum)

21

W Ustawieniach czytania jest miejsce na ustawienie liczby wyświetlanych postów, która wpływa na liczbę postów wyświetlanych we wszystkich kontekstach. Chciałbym zamiast tego wyświetlać pewną liczbę postów na stronie głównej i inną liczbę postów na stronach takich jak archiwum, wyniki wyszukiwania itp.

ustawienia-czytania-blog-strony-pokaż-co-na-stronie

Zdaję sobie sprawę, że mógłbym to zrobić, edytując pliki motywów i zmieniając parametry zapytania, ale wolałbym mieć łatwiejszy dostęp do prostej strony ustawień. Dawno temu natknąłem się na wtyczkę, która to zrobiła, ale nie mogę jej teraz znaleźć.

Czy ktoś wie o wtyczce, aby to zrobić, a nawet o funkcji, którą mógłbym wprowadzić w functions.php, aby osiągnąć to samo?

Doug
źródło
Prawdopodobnie zastanawiałeś się nad wtyczką @ Different-Posts na stronie @ chip-bennett: chipbennett.net/plugins/cbnet-different-posts-per-page, która robi to, co chcesz w sposób graficzny.
Tom Auger,

Odpowiedzi:

23

Uważam, że najlepszym sposobem na zrobienie tego we wtyczce jest uruchomienie następującej funkcji przykładowej po pre_get_postsnapotkaniu haka akcji. $wp_queryObiekt jest dostępny, czyli tagi warunkowe są dostępne, ale przed WordPress dostaje stanowisk, co oznacza, zmieniasz zapytanie vars przed pierwszym zapytaniu uruchomiony, raczej niż dodanie drugiego zapytania jak kiedy query_posts () jest używana w temacie plik.

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');
kevtrout
źródło
Używam tej funkcji na własnej stronie. Łatwo go było wyciąć i wkleić tutaj.
kevtrout
0

możesz wykonać niestandardową pętlę za pomocą zapytania_postów i określić liczbę postów według is_home, is_archive itp.

tylko prosta instrukcja if wraz z query_posts

chrismccoy
źródło
Tak, wspomniałem o tym w swoim pytaniu. Szukam sposobu, aby to zrobić, więc nie muszę edytować wielu plików motywów, aby zmienić ustawienia. Dzięki.
Doug
1
Robienie tego w ten sposób jest raczej złym pomysłem. WordPress już uruchamia zapytanie. Jeśli wstawisz query_postsmotyw, zignorujesz oryginalne zapytanie i zrobisz inne, zbędne.
Krzysiek Dróżdż
-1

Aby dodać do tego pytania. Czy ktoś wie, jak określić post_per_page dla tej funkcji funkcja custom_posts_per_page ($ query), jeśli doda nową stronę do index.php w następujący sposób:

<?php
if ($_GET['new'] == 1) 
{
    include ( TEMPLATEPATH . '/newpage.php' );
    exit;
}
?>
glazsasha
źródło
-1

Zdaję sobie sprawę, że mogę to zrobić, edytując pliki motywów i zmieniając parametry zapytania, ale wolałbym mieć łatwiejszy dostęp do prostej strony ustawień.

W trosce o kompletność stwierdziłam, że w query_postspołączeniu z $query_stringkonkatenacją działa dobrze.

Umieściłem ten kod w index.php(mój motyw nie ma category.php) ...

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

Oczywiście modyfikujemy wewnętrzny ciąg zapytania w pętli, zastępując domyślną liczbę postów na stronę .

Działa to tak, że zapewnia mniejszą listę postów na stronie głównej, na której pokazuję pełne posty, oraz znacznie większą listę postów wszędzie indziej (kategorie, według daty itp.), Gdzie wyświetlam tylko podsumowania postów.

Należy jednak pamiętać, że w przeciwieństwie do przyjętej odpowiedzi, zapytanie zostanie uruchomione dwukrotnie , więc nie jest to tak przyjemne rozwiązanie.

Jeff Atwood
źródło
Jeff, szukałem scentralizowanego miejsca do kontrolowania liczby postów zwracanych w różnych kontekstach. Twoja odpowiedź robi to tylko wtedy, gdy używasz index.php do obsługi WSZYSTKICH kontekstów, czego większość motywów nie robi. Oprócz zwiększenia wywołań do bazy danych (co wpływa na wydajność), twoja technika może również zmienić odpowiedź na tagi warunkowe (np. Is_home () lub is_front_page) w nieoczekiwany sposób. Na koniec, jeśli chcesz dodać pętle wtórne do strony, NIE powinieneś używać query_posts, ale zamiast tego użyj „new WP_Query” (lub get_posts).
Doug
@doug nie jest to pętla wtórna, przesłania ona główną pętlę - i tak, ten konkretny motyw używa index.php do renderowania wszystkiego, jest dość minimalistyczny. Czułem, że ma to większy sens tutaj jako odpowiedź, ale jeśli chcesz, mogę zadać własne pytanie i odpowiedzieć na nie, jeśli ta odpowiedź w jakiś sposób cię obraża.
Jeff Atwood
Właściwie źle odczytałem twój ostatni akapit i pomyślałem, że „większe” i „mniejsze” listy postów znajdują się na tej samej stronie, więc moje ostatnie zdanie powyżej było bez znaczenia. I tak, jeśli chcesz, możesz całkowicie umieścić swój kod w pliku index.php. A jeśli tak jest, to twoja metoda jest szybkim i łatwym sposobem na zrobienie tego, więc usunę moje głosowanie po zakończeniu 20-godzinnej blokady. Mimo to wysłanie nowego zapytania zamiast modyfikacji pierwotnego zapytania, tak jak w odpowiedzi kevtrout, jest mniej pożądane z powodów już wspomnianych (przez ciebie, mnie i kodeks WP).
Doug