Coloque o balão de notificação semelhante a atualização em vários menus de CPTs para itens pendentes

9

Assim como os itens de menu Plugins ou Comentários têm essas notificações numéricas em um balão para atualizações e comentários não moderados, respectivamente, eu gostaria de usar esse balão para exibir o número de CPTs com status "Revisão pendente". Como fazer isso?

Eu encontrei esta discussão , mas não tenho certeza para onde ir a partir daí.

Seria legal ter isso; pois preciso desse recurso em um site que usa conteúdo gerado pelo usuário (tipos de postagem personalizados). Sempre que os usuários enviam um novo CPT, seu status é definido como "Revisão pendente" e quero que os administradores do site olhem rapidamente o menu para ver quantos itens precisam de atenção.

EDIT: Agora tenho este código:

// 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;
            }
        }
    }
}

... o que funciona, embora um pouco inconsistente. Às vezes exibindo, às vezes não. Além disso, se eu tenho vários CPTs, como aplico esse código para cada item de menu desses CPTs? O código acima funcionará com apenas um CPT.

Hassan
fonte
A resposta no seu link explica muito bem: você deve armazenar os itens pendentes em um transitório para o seu caso. Qual código você tem?
Wyck
Verifique este outro também. Mas, sim, por favor, tente experimentar com o código e postar sua própria investigação aqui;)
brasofilo
@ Wyck Eu atualizei minha pergunta.
Hassan

Respostas:

12

Eu fiz esse trabalho iterando através de uma lista de tipos de postagem e identificando a $menuchave correta para o tipo de postagem usando uma função secundária (em vez de iterar manualmente através do $menuobjeto).

postagens pendentes de bolhas

Referência da função: get_post_typese 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
fonte
Oh, sim-- isso funciona! Por alguma razão, as bolhas desaparecem quando clico no item de menu correspondente do CPT, mas reaparecem quando estou em outras áreas no wp-admin. Não vou me preocupar com isso, problema resolvido.
Hassan
No meu ambiente de teste, as bolhas não desaparecem, bug engraçado que você chegou lá ... Eu gosto dessa coisa :) e a envolverei dentro de um plugin com configurações para selecionar tipos e status de postagens.
Brasofilo
Eu suspeito que é por causa do WPML. Usá-lo para gerenciar sites bilíngues, e eu tenho essencialmente 2 versões de cada post (cpt). É por isso que às vezes vejo a bolha dizendo 2, onde na verdade há 1 postagem pendente; porque as duas postagens sincronizam seus status. Ei, deixe-me saber sobre o plugin quando estiver pronto: D
Hassan