Fügen Sie eine aktualisierungsähnliche Benachrichtigungsblase in mehrere CPT-Menüs für ausstehende Elemente ein

9

Ähnlich wie die Menüelemente Plugins oder Kommentare diese Nummernbenachrichtigungen in einer Blase für Aktualisierungen bzw. nicht moderierte Kommentare enthalten, möchte ich diese Blase verwenden, um die Anzahl der CPTs anzuzeigen, die den Status "Ausstehende Überprüfung" haben. Wie soll man das machen?

Ich habe diesen Thread gefunden , bin mir aber nicht ganz sicher, wohin ich von dort aus gehen soll.

Das wäre schön zu haben; da ich diese Funktion auf einer Site benötige, die benutzergenerierten Inhalt verwendet (benutzerdefinierte Beitragstypen). Wenn Benutzer ein neues CPT einreichen, wird dessen Status auf "Ausstehende Überprüfung" gesetzt, und ich möchte, dass die Site-Administratoren schnell einen Blick auf das Menü werfen, um zu sehen, wie viele Elemente ihre Aufmerksamkeit benötigen.

EDIT: Ich habe jetzt diesen 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;
            }
        }
    }
}

... was funktioniert, wenn auch etwas inkonsistent. Manchmal anzeigen, manchmal nicht. Wenn ich mehrere CPTs habe, wie wende ich diesen Code für jeden einzelnen Menüpunkt dieser CPTs an? Der obige Code funktioniert nur mit einem CPT.

Hassan
quelle
Die Antwort in Ihrem Link erklärt es ziemlich gut. Sie würden stattdessen die ausstehenden Elemente in einem Übergang für Ihren Fall speichern. Welchen Code haben Sie?
Wyck
Überprüfen Sie auch diesen anderen . Aber, ja, bitte versuchen Sie, mit dem Code zu experimentieren und Ihre eigenen Ermittlungen hier zu veröffentlichen;)
brasofilo
@ Wyck Ich habe meine Frage aktualisiert.
Hassan

Antworten:

12

Ich habe diese Arbeit dazu gebracht, eine Liste mit Beitragstypen zu durchlaufen und $menumithilfe einer sekundären Funktion den richtigen Schlüssel für den Beitragstyp zu ermitteln (anstatt das $menuObjekt manuell zu durchlaufen ).

ausstehende Beiträge Blasen

Funktionsreferenz: get_post_typesund 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
quelle
Oh ja - das funktioniert! Aus irgendeinem Grund verschwinden die Blasen, wenn ich auf den entsprechenden CPT-Menüpunkt klicke, aber sie erscheinen wieder, wenn ich mich in anderen Bereichen von wp-admin befinde. Ich werde mich nicht darum kümmern, Problem gelöst.
Hassan
In meiner Testumgebung verschwinden die Blasen nicht, lustiger Fehler, den Sie dort haben ... Ich mag dieses Ding :) und verpacke es in ein Plugin mit Einstellungen zur Auswahl von Beitragstypen und -status.
Brasofilo
Ich vermute, es liegt an WPML. Ich verwende es, um eine zweisprachige Website zu verwalten, und ich habe im Wesentlichen 2 Versionen jedes Beitrags (cpt). Deshalb sehe ich manchmal die Blase mit der Aufschrift 2, in der tatsächlich 1 Post aussteht. weil beide Beiträge ihren Status synchronisieren. Hey, lass es mich über das Plugin wissen, wenn du fertig bist: D
Hassan