it-swarm.dev

Jak zobrazit jeden příspěvek na titulní stránce, ale mají normální stránkování?

Chtěl bych mít na své titulní stránce jeden příspěvek (vždy poslední), ale nechal jsem normální stránkovací práci. Takže přední strana má příspěvek 1, další strana by měla mít post 2-11 (1-10 je taky v pořádku), pak 12-21 nebo 11-20 a tak dále. Vím, že můžu změnit počet příspěvků v závislosti na kontextu , ale nastavení na "1" na domovské stránce znamená, že další stránky také zobrazují pouze jeden příspěvek.

Můj hlavní problém je, že /page/2/ a tak dále, ale /page/1/ vždy přesměruje na skutečnou domovskou stránku /. To znamená, že sloupky 2-10 jsou vždy vynechány, protože strana 2 ukazuje 11-20. I v současné době to vyřešíte tak, že se připojím k mému archivu, ale to není ideální, když přijdete na první příspěvky roku a existuje méně příspěvků a žádný zřejmý způsob pokračování.

8
Jan Fabry

Řešil jsem to pomocí parametru offset . To mi umožnilo upravit dotaz v háku pre_get_posts a zdá se, že je to nejčistší způsob, jak to udělat, bez nového dotazu. Domovská stránka nyní zobrazuje pouze jeden příspěvek a page/2/ zobrazuje příspěvky 2-11. Všechny odkazy fungují, žádná další úprava není nutná.

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, možná je to zvláštní nebo komplikovaný způsob, jak to udělat, ale měl jsem podobný problém (chtěl jsem zobrazit úvodní text a tři nejnovější příspěvky konkrétní kategorie na titulní stránce.

  1. Vytvořil jsem novou stránku s názvem home a vložil do ní můj uvítací text.
  2. Deaktivován výchozí domovskou stránku a nastavit vlastní domovskou stránku jako úvodní stránku
  3. Byla vytvořena nová (zkopírovaná a upravená) existující šablona stránky
    1. nechat zobrazit tělo stránky
    2. načte tři nejnovější příspěvky kategorie X a zobrazí je
    3. odkaz "více" pod ním, který odkazuje na kategorii/kategorie/kategorie-x /

vypadá takto: http://hinek.de (stránka je v němčině, omlouváme se)

Pokud by to mohla být cesta pro vás a potřebujete více informací nebo ukázky kódu pro šablonu stránky, přidejte komentář a tento příspěvek upravím.

3
Hinek

Předpokládám, že používáte Wordpress 3.0.x?

Pro zobrazení pouze jednoho příspěvku (v kategorii) na úvodní stránce je snadné. Použijte query_posts('post_per_page=1') ve vašem souboru home.php namísto vyvolání get_template_part('loop').

Chcete-li sledovat normální stránkovací metody, pak je to trochu složitější. Ve vašem souboru loop.php navrhuji, aby <?php global $paged; ?> před příkazem <?php if (have_posts()) : ?>, a pomocí $paged proměnné a funkce query_posts() změnil dotaz tak, aby zobrazoval správné příspěvky.

Soubor loop.php bude vypadat něco takového (poznámka: není testováno):

<?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;
?>

Použil jsem $paged - 1 jednoduše proto, že stránka 2 zobrazí příspěvky 1 - 10 a stránka 3 zobrazí příspěvky 11 - 20 a tak dále.

1
john010117

Tato otázka je trochu stará, ale pro ty, kteří to zjistili v moderní době, byste nikdy neměli volat query_posts . Z kodexu Wordpressu:

query_posts () je příliš zjednodušující a problematický způsob, jak změnit hlavní dotaz na stránku tím, že jej nahradí novou instancí dotazu. Je neefektivní (znovu spouští dotazy SQL) a za určitých okolností bude zcela neúspěšné (obzvláště často, když se jedná o stránkování stránek).

...

TL; DR nepoužívají query_posts () ever;

Namísto toho byste měli použít pre_get_posts zavěšení v function.php následujícím způsobem:

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 );

Všimněte si však, že v některých případech (například při úpravách posunů post) můžete pomocí háku pre_get_posts zmanipulovat stránkování. Opravovat to není super-tvrdý, ale je to něco, co si musí být vědom. Zde je příklad, jak to opravit zde .

0
lfalin