Placer une bulle de notification de type mise à jour sur plusieurs menus CPT pour les éléments en attente

9

Tout comme la façon dont les éléments du menu Plugins ou Commentaires ont ces notifications de nombre dans une bulle pour les mises à jour et les commentaires non modérés respectivement, je voudrais utiliser cette bulle pour afficher le nombre de CPT qui ont un statut "En attente de révision". Comment s'y prendre?

J'ai trouvé ce fil , mais je ne sais pas trop où aller à partir de là.

Ce serait bien d'avoir; car j'ai besoin de cette fonctionnalité sur un site qui utilise du contenu généré par l'utilisateur (types de publication personnalisés). Chaque fois que les utilisateurs soumettent un nouveau CPT, son statut est défini sur "En attente d'examen", et je veux que les administrateurs du site regardent rapidement le menu pour voir combien d'éléments nécessitent leur attention.

EDIT: J'ai maintenant ce code:

// buuble notifications for custom posts with status pending
add_action( 'admin_menu', 'add_pending_bubble' );

function add_pending_bubble() {
    global $menu;

    $custom_post_count = wp_count_posts('custom-post-name');
    $custom_post_pending_count = $custom_post_count->pending;

    if ( $custom_post_pending_count ) {
        foreach ( $menu as $key => $value ) {
            if ( $menu[$key][2] == 'edit.php?post_type=custom-post-name' ) {
                $menu[$key][0] .= ' <span class="update-plugins count-' . $custom_post_pending_count . '"><span class="plugin-count">' . $custom_post_pending_count . '</span></span>';
                return;
            }
        }
    }
}

... ce qui fonctionne, quoique un peu incohérent. Parfois afficher, parfois non. De plus, si j'ai plusieurs CPT, comment puis-je appliquer ce code pour chaque élément de menu de ces CPT? Le code ci-dessus fonctionnera avec un seul CPT.

Hassan
la source
La réponse dans votre lien l'explique assez bien, vous devriez plutôt stocker les éléments en attente dans un transitoire pour votre cas, quel code avez-vous?
Wyck
Vérifiez cet autre aussi. Mais, oui, s'il vous plaît, essayez d'expérimenter avec le code et postez votre propre enquête ici;)
brasofilo
@Wyck J'ai mis à jour ma question.
Hassan

Réponses:

12

J'ai fait ce travail en itérant à travers une liste de types de messages et en identifiant la $menuclé correcte pour le type de message en utilisant une fonction secondaire (au lieu de parcourir manuellement l' $menuobjet).

bulles de messages en attente

Référence de fonction: get_post_typeset wp_count_posts.

add_action( 'admin_menu', 'pending_posts_bubble_wpse_89028', 999 );

function pending_posts_bubble_wpse_89028() 
{
    global $menu;

    // Get all post types and remove Attachments from the list
    // Add '_builtin' => false to exclude Posts and Pages
    $args = array( 'public' => true ); 
    $post_types = get_post_types( $args );
    unset( $post_types['attachment'] );

    foreach( $post_types as $pt )
    {
        // Count posts
        $cpt_count = wp_count_posts( $pt );

        if ( $cpt_count->pending ) 
        {
            // Menu link suffix, Post is different from the rest
            $suffix = ( 'post' == $pt ) ? '' : "?post_type=$pt";

            // Locate the key of 
            $key = recursive_array_search_php_91365( "edit.php$suffix", $menu );

            // Not found, just in case 
            if( !$key )
                return;

            // Modify menu item
            $menu[$key][0] .= sprintf(
                '<span class="update-plugins count-%1$s" style="background-color:white;color:black"><span class="plugin-count">%1$s</span></span>',
                $cpt_count->pending 
            );
        }
    }
}

// http://www.php.net/manual/en/function.array-search.php#91365
function recursive_array_search_php_91365( $needle, $haystack ) 
{
    foreach( $haystack as $key => $value ) 
    {
        $current_key = $key;
        if( 
            $needle === $value 
            OR ( 
                is_array( $value )
                && recursive_array_search_php_91365( $needle, $value ) !== false 
            )
        ) 
        {
            return $current_key;
        }
    }
    return false;
}
brasofilo
la source
Oh, oui - ça marche! Cependant, pour une raison quelconque, les bulles disparaissent lorsque je clique sur l'élément de menu CPT correspondant, mais elles réapparaissent lorsque je suis dans d'autres zones de wp-admin. Je ne vais pas m'embêter avec ça, problème résolu.
Hassan
Dans mon environnement de test, les bulles ne disparaissent pas, bug amusant que vous avez là ... j'aime cette chose :) et je l'envelopperai dans un plugin avec des paramètres pour sélectionner les types de post et le statut.
brasofilo
Je soupçonne que c'est à cause de WPML. L'utiliser pour gérer un site Web bilingue, et j'ai essentiellement 2 versions de chaque poste (cpt). C'est pourquoi je vois parfois la bulle disant 2 où il y a en fait 1 poste en attente; car les deux publications synchronisent leurs statuts. Hé, informez-moi du plugin lorsque vous avez terminé: D
Hassan