Ponga una burbuja de notificación de actualización en múltiples menús de CPT para elementos pendientes

9

Al igual que los elementos del menú Complementos o Comentarios tienen estas notificaciones numéricas en una burbuja para actualizaciones y comentarios no moderados respectivamente, me gustaría usar esa burbuja para mostrar el número de CPT que tienen un estado de "Revisión pendiente". ¿Cómo hacer eso?

He encontrado este hilo , pero no estoy seguro de a dónde ir desde allí.

Eso sería genial tenerlo; ya que necesito esta función en un sitio que utiliza contenido generado por el usuario (tipos de publicaciones personalizadas). Cada vez que los usuarios envían un nuevo CPT, su estado se establece en "Revisión pendiente", y quiero que los administradores del sitio lean rápidamente el menú para ver cuántos elementos necesitan su atención.

EDITAR: ahora tengo 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;
            }
        }
    }
}

... que funciona, aunque un poco inconsistente. A veces se muestra, a veces no. Además, si tengo múltiples CPT, ¿cómo aplico este código para todos y cada uno de los elementos del menú de esos CPT? El código anterior funcionará con un solo CPT.

Hassan
fuente
La respuesta en su enlace lo explica bastante bien, en su lugar almacenaría los elementos pendientes en un transitorio para su caso, ¿qué código tiene?
Wyck
Mira este otro también. Pero sí, por favor, intente experimentar con el código y publique su propia investigación aquí;)
brasofilo
@Wyck He actualizado mi pregunta.
Hassan

Respuestas:

12

Hice este trabajo iterando a través de una lista de tipos de publicación y señalando la $menuclave correcta para el tipo de publicación utilizando una función secundaria (en lugar de iterar manualmente a través del $menuobjeto).

mensajes pendientes burbujas

Referencia de función: get_post_typesy 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
fuente
¡Oh, sí, eso funciona! Sin embargo, por alguna razón, las burbujas desaparecen cuando hago clic en el elemento del menú CPT correspondiente, pero reaparecen cuando estoy en otras áreas en wp-admin. No voy a molestarme con eso, problema resuelto.
Hassan
En mi entorno de prueba, las burbujas no desaparecen, es un error gracioso que llegaste allí ... Me gusta esto :) y lo envolverá dentro de un complemento con configuraciones para seleccionar los tipos de publicaciones y el estado.
brasofilo
Sospecho que es por WPML. Lo uso para administrar sitios web bilingües, y tengo esencialmente 2 versiones de cada publicación (cpt). Es por eso que a veces veo la burbuja que dice 2 donde en realidad hay 1 publicación pendiente; porque ambas publicaciones sincronizan sus estados. Oye, avísame sobre el complemento cuando hayas terminado: D
Hassan