Umieść bąbelek powiadomień przypominający aktualizację w wielu menu CPT dla oczekujących elementów

9

Podobnie do tego, w jaki sposób elementy menu Wtyczki lub Komentarze mają te powiadomienia liczbowe w dymku odpowiednio dla aktualizacji i niemoderowanych komentarzy, chciałbym użyć tego bąbelka do wyświetlenia liczby CPT, które mają status „Oczekuje na sprawdzenie”. Jak to zrobić?

Znalazłem ten wątek , ale nie do końca wiem, dokąd się udać.

Byłoby fajnie mieć; ponieważ potrzebuję tej funkcji w witrynie, która korzysta z treści generowanych przez użytkowników (niestandardowe typy postów). Za każdym razem, gdy użytkownicy przesyłają nowy CPT, jego stan jest ustawiany na „Oczekuje na sprawdzenie” i chcę, aby administratorzy witryny szybko spojrzeli na menu, aby zobaczyć, ile elementów wymaga uwagi.

EDYCJA: Mam teraz ten kod:

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

... co działa, choć trochę niekonsekwentnie. Czasami wyświetla się, czasem nie. Ponadto, jeśli mam wiele CPT, jak zastosować ten kod do każdego elementu menu tych CPT? Powyższy kod będzie działał tylko z jednym CPT.

Hassan
źródło
Odpowiedź w twoim linku wyjaśnia to całkiem dobrze, zamiast tego przechowałbyś oczekujące elementy w stanie przejściowym dla twojej sprawy, jaki masz kod?
Wyck
Sprawdź także ten drugi . Ale tak, proszę, spróbuj eksperymentować z kodem i opublikuj tutaj własne dochodzenie;)
brasofilo
@ Wyck Zaktualizowałem swoje pytanie.
Hassan

Odpowiedzi:

12

Zrobiłem tę pracę iterując po liście typów postów i wskazując właściwy $menuklucz dla typu postu za pomocą dodatkowej funkcji (zamiast ręcznego iterowania po $menuobiekcie).

bąbelki w toku

Referencja funkcji: get_post_typesi 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
źródło
Och, tak - to działa! Z jakiegoś powodu bąbelki znikają po kliknięciu odpowiedniego elementu menu CPT, ale pojawiają się ponownie, gdy jestem w innych obszarach wp-admin. Nie będę się tym przejmować, problem rozwiązany.
Hassan
W moim środowisku testowym bąbelki nie znikają, zabawny błąd, który tam masz ... Podoba mi się to :) i zawiń go we wtyczce z ustawieniami, aby wybrać typy postów i status.
brasofilo
Podejrzewam, że to z powodu WPML. Używam go do zarządzania dwujęzyczną stroną internetową, a ja mam zasadniczo 2 wersje każdego postu (cpt). Dlatego czasami widzę bańkę z napisem 2, w której faktycznie jest 1 oczekujący post; ponieważ oba posty synchronizują swoje statusy. Hej, daj mi znać o wtyczce, kiedy skończysz: D
Hassan