Je suis en train de redessiner un site web de nouvelles locales. L'ancien design utilisait un grand nombre de catégories pour gérer la position du contenu dans la page d'accueil statique, comme dans "Top News", "Middle Box", "Left Box", etc.
Cela fonctionne d'une certaine manière, mais c'est très moche, à mon avis, très faux sur le plan sémantique: les catégories devraient être utilisées pour classer par catégories.
Une autre option pourrait être d’utiliser des messages collants, mais vous ne pouvez avoir qu’une situation "collante" ou "non collante" qui est un peu limitée.
Je n'utiliserais pas de types de messages personnalisés: en principe, tous les messages sont des informations et il serait excessif de disposer d'un CPT distinct pour positionner mon contenu sur la page d'accueil.
La solution parfaite serait:
Pour récapituler, j'ai 5 boîtes, dont 4 constituent un conteneur de nouvelles unique "de niveau supérieur", la dernière contient 10 nouvelles dans un ordre chronologique inverse. Ces 10 nouvelles devraient être des informations "normales" et des informations "de niveau supérieur" repoussées des cases supérieures.
Je pensais à Advanced Custom Field comme une solution permettant à l'éditeur de choisir le poste, mais je ne suis pas sûr que ce soit faisable au début.
Merci!
Après de nombreuses recherches et des erreurs d'essai, je pense avoir trouvé une solution.
Il s'agit de champs personnalisés pour lesquels j'ai utilisé Champ personnalisé avancé , mais c'est facultatif.
Pour simplifier les choses à l'auteur du site, j'ai mis une metabox avant l'actualité.
Maintenant, sur ma page d’accueil, j’ai 5 zones: 4 d’entre elles ne contiennent qu’une nouvelle actualité et la cinquième est une boîte "autres actualités" contenant dix nouvelles.
Donc, les 4 premières cases sont assez faciles:
$recentPosts = new WP_Query();
$recentPosts->query(array(
'meta_key' => 'position',
'meta_value' => 'Top1',
'showposts' => 1
)
);
avec la méta-valeur avec la position correcte dont j'ai besoin.
Le problème principal était: comment puis-je insérer les nouvelles plus anciennes "Top1" dans la case "autres nouvelles" sans avoir à basculer manuellement le champ personnalisé?
$top1 = get_posts(array(
'meta_key' => 'position',
'meta_value' => 'Top1',
'offset' => 1
));
$top2 = get_posts(array(
'meta_key' => 'position',
'meta_value' => 'Top2',
'offset' => 1
));
$top3 = get_posts(array(
'meta_key' => 'position',
'meta_value' => 'Top3',
'offset' => 1
));
$top4 = get_posts(array(
'meta_key' => 'position',
'meta_value' => 'Top4',
'offset' => 1
));
$other = get_posts(array(
'meta_key' => 'position',
'meta_value' => 'Other news'
));
$mergedposts = array_merge( $top1, $top2, $top3, $top4, $other );
$postids = array();
foreach( $mergedposts as $item ) { $postids[]=$item->ID; }
$uniqueposts = array_unique($postids);
$posts = get_posts(array(
'post__in' => $uniqueposts,
'showposts' => 3
));
foreach( $posts as $post ) :
setup_postdata($post);
Peut-être que le code pourrait être un peu nettoyé, mais il fonctionne comme j'avais besoin. J'espère que c'est utile.
Je proposerais d'ajouter des champs personnalisés aux messages (soit par convention, soit en créant une boîte méta dédiée), puis de créer la logique dans front-page.php pour savoir comment les afficher.
EDIT: pour ignorer certaines publications d'une requête, utilisez le paramètre offset:
$query = new WP_Query( 'offset=1' ) );
Plus d'informations dans la section du Codex sur la pagination sur WP_Query