Impostazione del numero di articoli per pagina non funziona? - Risoluzione
OK, ecco il mio problema. Ho una homepage statica e una pagina separata per gli articoli nel mio sito WordPress. Ho definito entrambe nel pannello di amministrazione. Ho impostato il numero massimo di articoli da visualizzare a 5 (in Impostazioni > Lettura), ma tutti gli articoli (10+) vengono comunque mostrati nella pagina del blog.
Sto anche visualizzando gli ultimi 3 articoli nella homepage statica usando una query personalizzata. Esempio:
$wp_query = new WP_Query( array( 'posts_per_page' => 3));
<codice del loop dei risultati>
Ma anche questa lista mostra più di 3 articoli. Sembra che WordPress stia ignorando il limite posts_per_page che ho impostato, sia nel pannello admin che nel codice. Cosa sta succedendo? È la prima volta che uso WordPress per sviluppare un sito. È un problema comune per i principianti?
MODIFICA:
Ho semplificato la homepage statica lasciando solo un blocco di codice base che recupera i titoli degli articoli. Vengono ancora restituiti più di 3 articoli. Ecco il codice attuale (e unico) presente nella homepage:
<div id="content">
<?php $wp_query = new WP_Query( array( 'posts_per_page' => 3) );?>
<?php if ( $wp_query->have_posts() ) : ?>
<ul>
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<li>
<a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
</li>
<?php endwhile;?>
</ul>
<?php endif; ?>
</div>

Volevo aggiungere il mio caso a questa lista perché ci ho messo tantissimo tempo a debuggarlo. Il problema è che ho modificato il numero di post visualizzati in una pagina archivio utilizzando l'hook pre_get_post:
add_filter('pre_get_posts', 'number_of_posts_on_archive');
function number_of_posts_on_archive($query)
{
if(is_post_type_archive(array('post_type1', 'post_type2')))
{
$query->set('posts_per_page', 20);
}
return $query;
}
Per risolvere il problema in cui includeva la query per un tipo di post completamente diverso, ho aggiunto qualcosa come questo all'istruzione if:
if( (is_post_type_archive(array('post_type1', 'post_type2'))) && ($query->get('post_type') !== 'post') )
{
....
}
Il motivo per cui lo posto qui è che questo è il primo risultato che è apparso nella ricerca Google relativa alla mia ricerca. Quindi potrebbe aiutare qualcuno che non riesce a capire per un'ora... o due perché la query proprio non vuole ascoltarti.

Ciò potrebbe essere causato da un tema o un plugin che sovrascrive le impostazioni di WordPress. Potresti provare ad attivare il tema TwentyEleven o TwentyTen, oltre a disabilitare qualsiasi plugin, per verificare se funziona in quel caso.
Se così fosse, potresti indicare quale tema stai utilizzando (se è predefinito) o quali plugin hai dovuto disabilitare per farlo funzionare - e possiamo vedere cosa si può fare per rimediare.

Grazie. Ho disabilitato lo stupido tema e ha funzionato! L'ho preso da devpress.com (tema news). Viene pubblicizzato come un tema genitore "avanzato" e agli utenti viene detto di non "toccare" nulla. Immagino che con "avanzato" intendessero mal codificato, dato che tutto quello che ho fatto è stato aggiungere il codice per recuperare i post dopo il loro slideshow sofisticato.

//aggiungi questo codice prima di chiamare il tuo e personalizzalo come preferisci
function hwl_home_pagesize( $query ) {
if ( is_admin() || ! $query->is_main_query() )
return;
if ( is_home() ) {
// Mostra solo 1 articolo per l'archivio blog originale
$query->set( 'posts_per_page', 1 );
return;
}
if ( is_post_type_archive( 'movie' ) ) {
// Mostra 50 articoli per un custom post type chiamato 'movie'
$query->set( 'posts_per_page', 50 );
return;
}
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

N.Schipper ha ragione. Ma l'unica condizione non è sufficiente senza la condizione
! is_admin()
In questo modo il numero di post per pagina verrà modificato solo nei cicli necessari e non influenzerà l'area di amministrazione.
if( (! is_admin()) && (is_post_type_archive(array('post_type1', 'post_type2'))) && ($query->get('post_type') !== 'post') )
{
{
$query->set( 'posts_per_page', 6 );
return;
}
}
