web-dev-qa-db-fra.com

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

Tout comme le menu Plugins ou Commentaires contient ces notifications de numéro dans une bulle pour les mises à jour et les commentaires non modérés, j'aimerais utiliser cette bulle pour afficher le nombre de CPT ayant le 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 un 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 de révision" et je souhaite que les administrateurs du site jettent un coup d'œil rapide sur le menu pour déterminer le nombre d'éléments nécessitant 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;
            }
        }
    }
}

... qui fonctionne, bien qu'un peu incohérent. Afficher parfois, 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.

9
Hassan

J'ai effectué ce travail en parcourant une liste de types de publications et en repérant la clé $menu appropriée pour le type de publication à l'aide d'une fonction secondaire (au lieu d'effectuer une itération manuelle via l'objet $menu).

pending posts bubbles

Référence de la fonction: get_post_types et 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;
}
12
brasofilo