Par blog a un menu en-tête composé de différents liens vers des pages telles que "À propos de nous", "Aide", "Contactez-nous" et "Blog".
Le lien "Blog" est en fait une page avec un modèle personnalisé qui affiche tous les messages de ma catégorie "blog".
Ce que je veux faire, c’est d’afficher un petit message/lien de notification près de mon lien "Blog" dans le menu supérieur si la catégorie "blog" contient une publication publiée dans les dernières 24 heures .
Le thème que j'utilise utilise la fonction wp_nav_menu
pour afficher le menu dans header.php.
Y'a-t-il une quelconque façon de réussir cela?
Je voudrais stocker un transitoire avec une durée de vie de 24 heures lorsqu'un article (dans une catégorie, j'utilise la catégorie avec l'ID 333 par exemple) est publié. Chaque fois que des publications ultérieures sont publiées, le transitoire est mis à jour ou recréé si 24 heures se sont écoulées et si le transitoire a été supprimé.
Chaque fois qu'une publication change d'un statut en publication (y compris les mises à jour des publications actuellement publiées), une publication de type transition_post_status
est déclenchée. Cette action transmet l'ancien statut, le nouveau statut et l'objet post. En nous connectant à cela, nous pouvons vérifier:
Si c'est le cas, nous mettons à jour un transitoire qui dure 24 heures.
add_action('transition_post_status', 'wpse_maybe_update_new_post_transient',10,2);
function wpse_maybe_update_new_post_transient($new_status, $old_status,$post){
if( 'post' != get_post_type($post) || !has_term( 333, 'category', $post) ){
return;
}
if( 'publish' == $new_status && $new_status != $old_status && ){
set_transient('wpse_post_published', $post->ID, 60*60*24 );
}
}
get_transient('wpse_post_published')
ne devrait alors renvoyer quelque chose que si un article a été publié au cours des 24 dernières heures.
Ainsi, lors de la création du menu, nous pouvons vérifier le transitoire - et ajouter conditionnellement la classe new-post-published à un élément de menu.
Dans cet exemple, l'élément de menu auquel j'ajoute la classe correspond à un terme 'catégorie' (avec l'ID 333). Je ne l'ai pas encore fait ici, mais vous pouvez utiliser le $arg
pour vérifier que le menu se trouve également à un emplacement particulier.
add_filter( 'nav_menu_css_class','wpse_maybe_add_new_post_class',10,3);
function wpse_maybe_add_new_post_class($classes, $item, $arg){
if( 'taxonomy' == $item->type && 'category' == $item->object && 333 == $item->object_id ){
if( get_transient('wpse_post_published') ){
$classes[] = 'new-post-published';
}
}
return $classes;
}
Ensuite, vous pouvez styler l'élément de manière appropriée. La même idée, avec d’autres filtres, peut être utilisée pour insérer des éléments supplémentaires (par exemple walker_nav_menu_start_el
) ou via un lecteur personnalisé.
Cette méthode présente les inconvénients suivants:
Le dernier point a une solution facile en utilisant la méthode ci-dessus. Les deux premiers sont un peu plus compliqués, et si ces deux sont importants, vous devez alors effectuer une requête pour le dernier message publié dans la catégorie 333, au cours des 24 dernières heures. Si vous le trouvez, mettez à jour le transitoire afin qu'il expire 24 heures après la publication du message.
Cette seconde méthode est beaucoup plus robuste, mais un peu plus chère.