Come mostrare un singolo post in prima pagina ma avere un normale paging?


9

Vorrei avere un singolo post sulla mia prima pagina (sempre l'ultimo), ma far funzionare il normale paging. Quindi la prima pagina ha post 1, la pagina successiva dovrebbe avere post 2-11 (anche 1-10 va bene), quindi 12-21 o 11-20 e così via. So che posso cambiare il numero di post in base al contesto , ma impostandolo su "1" nella homepage significa che anche le altre pagine mostrano solo un post.

Il mio problema principale è che /page/2/, e così via opere, ma /page/1/reindirizza sempre alla home page vera, /. Ciò significa che i post 2-10 vengono sempre ignorati, poiché la pagina 2 mostra 11-20. Al momento lo risolvo collegandomi al mio archivio, ma questo non è l'ideale quando si arriva ai primi post dell'anno e ci sono meno post e nessun modo ovvio di continuare.

Risposte:


7

L'ho risolto usando il offsetparametro query . Questo mi ha permesso di modificare la query nel pre_get_postsgancio e sembra essere il modo più pulito per farlo, senza una nuova query. Ora la home page mostra solo un post e page/2/mostra i post 2-11. Tutti i collegamenti continuano a funzionare, non sono necessarie altre modifiche.

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

Se funziona, l'OP dovrebbe usarlo.
john010117,

Cosa che faccio, perché ho scritto la domanda e questa risposta. Ma grazie per i tuoi suggerimenti, mi hanno portato sulla strada giusta.
Jan Fabry,

Esiste la possibilità di farlo funzionare su un archivio.php o category.php, mostrando solo gli ultimi 2 post nella pagina 1 mantenendo la corretta impaginazione? Grazie!
Entro il

@Amit: Se sostituisci is_front_page()con is_archive()o is_category(), penso che puoi arrivare dove devi essere.
Jan Fabry,

3

Ok, forse questo è un modo strano o complicato per farlo, ma ho avuto un problema simile (volevo mostrare un testo di benvenuto e i tre post più recenti di una categoria specifica in prima pagina. Così ho fatto:

  1. Crea una nuova pagina chiamata home e metti il ​​mio testo di benvenuto.
  2. Disattiva la home page predefinita e imposta la mia home page personalizzata come pagina iniziale
  3. Creato un nuovo modello di pagina (copiato e modificato)
    1. lascia che visualizzi il corpo della pagina
    2. carica tre post più recenti della categoria X e visualizzali
    3. avere un link "altro" sotto di esso che collega su / categoria / categoria-x /

assomiglia a questo: http://hinek.de (la pagina è in tedesco, scusa)

Se questo potrebbe essere il modo per te e hai bisogno di maggiori informazioni o di un esempio di codice per il modello di pagina, commenta e io modificherò questo post.


Questo funziona perché visualizzi solo i post nella categoria "Messaggio della ... qualunque", e quindi puoi andare alla pagina di quella categoria e utilizzare il normale paging. Voglio mostrare post di tutte le categorie, quindi questo approccio non funzionerà per me. Non hai un posto dove le persone possono sfogliare tutti i post di tutte le categorie?
Jan Fabry,

1

Suppongo che stai eseguendo Wordpress 3.0.x?

Mostrare solo un post (in qualunque categoria) in prima pagina è facile. Usa query_posts('post_per_page=1')nel tuo home.phpfile invece di invocare get_template_part('loop').

Seguire i normali metodi di paging dopo è un po 'complicato. Nel tuo loop.phpfile, suggerisco di mettere <?php global $paged; ?>prima la <?php if (have_posts()) : ?>dichiarazione e di usare la $pagedvariabile e la query_posts()funzione per modificare la tua query in modo che mostri i post giusti.

Il tuo loop.phpfile sarebbe simile a questo (nota: non testato):

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

Ho usato $paged - 1semplicemente perché la pagina 2 mostrerà i post 1 - 10, e la pagina 3 mostrerà i post 11 - 20 e così via.


La modifica del pagedparametro non interromperà nient'altro, come il next_posts_link?. Forse è meglio modificare la query nel pre_get_postshook, quindi non creo una nuova query? E sì, questo è WP 3.
Jan Fabry,

AFAIK, non dovrebbe interessare next_posts_link. L'unico modo per scoprirlo è provarlo, ovviamente.
john010117,

1
Argh, se provo a modificare il pagedparametro pre_get_postsnell'hook, redirect_canonicalentra e vuole sostituire l'URL con il nuovo pagedparametro. In questo caso posso disabilitare i reindirizzamenti, ma next_posts_linkutilizza una $pagedvariabile globale che viene impostata sul nuovo valore, ma non so con quale codice, quindi non è corretto.
Jan Fabry,

Hai davvero provato a usare il mio codice e vedere se funziona? Non ho troppa familiarità con il pre_get_postsgancio, quindi non posso essere di grande aiuto lì. Inoltre, prova a modificare $pageddirettamente la variabile (es:) $paged = $paged - 1)se sei preoccupato next_posts_link().
john010117,

0

Questa domanda è un po 'vecchia, ma per coloro che la trovano nell'era moderna, non dovresti mai chiamare query_posts . Dal codice Wordpress:

query_posts () è un modo eccessivamente semplicistico e problematico per modificare la query principale di una pagina sostituendola con una nuova istanza della query. È inefficiente (esegue nuovamente le query SQL) e fallirà completamente in alcune circostanze (specialmente spesso quando si tratta della paginazione dei post).

...

TL; DR non usa mai query_posts ();

Invece, dovresti usare l' pre_get_postshook in Functions.php come segue:

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

Tuttavia, attenzione che in alcuni casi (come la regolazione degli offset delle poste), l'uso di un pre_get_postshook può rovinare la tua impaginazione. Risolvere questo non è molto difficile, ma è qualcosa di cui essere consapevoli. C'è un esempio di come risolvere questo problema qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.