Donc, dans le modèle, j'ai plusieurs messages et curseurs en vedette et deux boucles par défaut.
J'utilise get_posts
pour tout sauf les boucles par défaut (évidemment).
Maintenant, le problème que je rencontre est d'exclure les publications get_posts
des boucles principales. J'aurais pu utiliser la méthode query_posts
, mais l'impact sur les performances est mauvais et je souhaite travailler sur la boucle principale avant même qu'elle ne soit générée.
Je vais donc utiliser pre_get_posts
dans functions.php.
À l'intérieur de pre_get_posts, je vais modifier la boucle principale et exclure les données get_posts.
J'ai des problèmes suivants:
Je dois utiliser get_posts dans le modèle, donc je dois déclarer la variable qui les contient comme globale :( sinon, elle ne sera pas accessible dans mon modèle.
get_posts à l'intérieur de pre_get_posts me donne des problèmes de mémoire: Erreur fatale: une taille de mémoire autorisée de 134217728 octets est épuisée (tentative d'allocation de 130 968 octets).
function RoomsGazette_homepage_content( $query ) {
//$tweets = getTweets( 4, $titan->getOption( 'tweets_from_user' ) );
$header_sliders = get_posts( array( 'meta_key' => 'roomsgazette_hp_position', 'meta_value' => 1, 'posts_per_page' => 5, ) );
//$footer_sliders = get_posts( array( 'meta_key' => 'roomsgazette_hp_position', 'meta_value' => 2, 'posts_per_page' => 5, ) );
//$featured = get_posts( array( 'meta_key' => 'roomsgazette_hp_position', 'meta_value' => 3, 'posts_per_page' => 2, ) );
$exclude_ids = array();
foreach ( $header_sliders as $tmp ) {
array_Push( $exclude_ids, $tmp->ID );
}
foreach ( $footer_sliders as $tmp ) {
array_Push( $exclude_ids, $tmp->ID );
}
foreach ( $featured as $tmp ) {
array_Push( $exclude_ids, $tmp->ID );
}
if ( $query->is_home() && $query->is_main_query() )
{
$query->set( 'post__not_in', $exclude_ids );
}
}
add_action( 'pre_get_posts', 'RoomsGazette_homepage_content' );
Tout d'abord, vous invoquez une boucle infinie, ce qui provoque l'épuisement de la mémoire. Pour éviter cela, mettez ce qui suit au début de votre fonction:
// avoid infinite loop
remove_action( 'pre_get_posts', __FUNCTION__ );
Il s'assure que vous ne le connectez pas à pre_get_posts
encore et encore, en relançant votre appel get_posts()
encore et encore.
Deuxièmement, utilisez WP_Query
- et ensuite get_posts
- le paramètre fields
, en choisissant ids
comme valeur, ce qui réduit la charge mémoire/travail en obtenant uniquement les ID.