web-dev-qa-db-fra.com

Meilleure façon d’attribuer une position à un post dans la page d’accueil d’un site de nouvelles (pas de catégories, pas de post-it)

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:

  • être capable de choisir entre n position (j'ai besoin de 4)
  • avoir un statut par défaut qui met le message dans la boîte "autres nouvelles"
  • contrôler le nombre de messages postés dans une boîte spécifique: la boîte de nouvelles principale ne contient qu'une nouvelle. S'il y a une nouvelle "nouvelle principale", l'ancienne ne devrait pas disparaître de la page d'accueil, mais passer à une position inférieure.

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!

1
molokom

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é.

enter image description here

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.

0
molokom

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.

  1. Ajoutez des champs personnalisés aux articles, par exemple. "main_news"
  2. Avoir plusieurs boucles sur front-page.php en filtrant simplement les publications qui répondent à vos critères pour les mettre dans une boîte.

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

0
kraftner