web-dev-qa-db-fra.com

Nouvelle notification de publication dans wp_nav_menu

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?

6
Mihai

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

Logique

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:

  • le nouveau statut est 'publier' et l'ancien statut est quelque chose d'autre (c'est-à-dire récemment publié )
  • C'est du type post 'post'
  • C'est dans la catégorie 333

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

Caveat

Cette méthode présente les inconvénients suivants:

  • Si une publication est publiée, le fait d'annuler la publication en revenant au statut de brouillon ou en le planifiant pour l'avenir ne sera pas observé. En d'autres termes, le transitoire existera toujours et le menu affichera toujours le message "nouveau publié".
  • De même si vous publiez une publication dans la catégorie 333, puis la supprimez de cette catégorie.
  • Si vous publiez un article n'appartenant pas à la catégorie 333 et que vous le mettez à jour de la sorte, cela n'ajoutera pas le "nouveau post publié".

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.

1
Stephen Harris