Domanda

Mi piacerebbe avere un singolo post sulla mia pagina anteriore (sempre l'ultimo), ma lasciare che il lavoro normale di paging. Così la prima pagina ha posto 1, la pagina successiva dovrebbe avere dopo 2-11 (1-10 è troppo bella), poi 12-21 e 11-20, e così via. So che posso cambiare il numero di posti a seconda del contesto , ma l'impostazione a "1" sui mezzi homepage le ulteriori pagine mostrano anche un solo post.

Il mio problema principale è che /page/2/ e così via opere, ma /page/1/ reindirizza sempre alla vera home page, /. Ciò significa che i messaggi 2-10 sono sempre ignorati, dal momento che la pagina 2 mostra 11-20. I attualmente risolvere questo collegando al mio archivio, ma questo non è l'ideale quando si arriva a i primi post dell'anno e ci sono meno posti e non c'è modo evidente di continuare.

È stato utile?

Soluzione

ho risolto utilizzando il parametro di query offset . Questo mi ha permesso di modificare la query nel gancio pre_get_posts, e sembra essere il modo più pulito per fare questo, senza una nuova query. Ora le home page mostra un solo post, e page/2/ spettacoli messaggi 2-11. Tutti i link continuare a lavorare, non è richiesta alcuna altra modifica.

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

Altri suggerimenti

Ok, forse questo è uno strano modo o complicato per fare questo, ma ho avuto un problema simile (ho voluto mostrare un testo di benvenuto e le tre messaggi più recenti di una categoria specifica in prima pagina così ho fatto:.

  1. Creato una nuova pagina chiamata a casa e mettere il mio messaggio di benvenuto su di esso.
  2. Disattivato la home page predefinita e impostare la mia home page personalizzata come pagina iniziale
  3. Creato un nuovo (copiato e modificato uno già esistente) modello di pagina
    1. lasciarlo visualizzare la pagina corpo
    2. carico tre messaggi più recenti di categoria X e li visualizza
    3. ha un collegamento "di più" sotto di esso che i collegamenti su / categoria / category-x /

aspetto: http://hinek.de (pagina in tedesco, sorry)

Se questo potrebbe essere il modo per voi e avete bisogno di maggiori informazioni o un esempio di codice per il modello di pagina, commento e mi permetterà di modificare questo post.

Sto assumendo si sta eseguendo Wordpress 3.0.x?

Per visualizzare un solo post (in qualsiasi categoria) in prima pagina è facile. Usa query_posts('post_per_page=1') nel file home.php invece di invocare get_template_part('loop').

Per seguire i normali metodi di paging dopo che è un po 'difficile. Nel file loop.php, Suggerisco di mettere <?php global $paged; ?> prima dell'istruzione <?php if (have_posts()) : ?>, e usando la variabile e la funzione $paged query_posts() di modificare la query in modo che mostra i posti giusti.

Il file loop.php sarebbe simile a questa (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 - 1 semplicemente perché la pagina 2 mostrerà i messaggi 1 - 10, e la pagina 3 mostra i messaggi 11 -. 20, e così via

Questa domanda è un po 'vecchio, ma per coloro che trovare questo in epoca moderna, non si dovrebbe mai chiamare query_posts . Dal codice di Wordpress:

query_posts () è eccessivamente modo semplicistico e problematico modificare principale interrogazione di una pagina sostituendola con nuova istanza della query. È inefficienti (ri-corre query SQL) e sarà a titolo definitivo non riuscire in qualche circostanze (in particolare spesso quando si tratta di messaggi di impaginazione).

...

TL; DR non utilizzare query_posts () mai;

Al contrario, è necessario utilizzare il gancio pre_get_posts 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, fate attenzione che in alcuni casi, (come ad esempio la regolazione offset post), utilizzando un gancio pre_get_posts può manipolare il vostro impaginazione. Fissaggio questo non è super-duro, ma è qualcosa di essere a conoscenza. C'è un esempio di come risolvere questo problema qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a wordpress.stackexchange
scroll top