Füge neue Einträge (post_status = pending) zum Administrationsmenü hinzu

Was ich habe: Ein benutzerdefinierter Beitragstyp. Ein Frontend-Buchungsformular, das neue Posts mit post_status = pending bis sie manuell überprüft und der Status in published geändert wird.

Was ich brauche: Während ich auf die Liste der Beiträge gehen kann und sehe, ob es irgendwelche mit “Ausstehend” gibt, um zu autorisieren; Was ich will, ist ein rundes Symbol mit einer Zahl innerhalb hinzufügen, wie WordPress tut, wenn es neue Kommentare gibt. Ich kann den Code schreiben, um die Anzahl der ausstehenden Posts zu extrahieren, aber ich habe keine Ahnung, wie ich es in das Admin-Menü einfügen kann.

Dies ist der Code, der von wp erstellt wird, wenn ein neuer Kommentar hinzugefügt wird:

 1 

Ein Screenshot, der einen neuen Kommentar zeigt, ich brauche das gleiche bei Items.

Ich suche seit einiger Zeit nach einer Lösung und kann sie nirgends finden; Meine nächste Station, wenn mir niemand antworten kann, ist, den WP-core auseinander zu nehmen und zu sehen, wie sie es dort machen.

Solutions Collecting From Web of "Füge neue Einträge (post_status = pending) zum Administrationsmenü hinzu"

Normalerweise ist alles in $labels['menu_name'] Argument in cpt Registrierung ist im Menü gedruckt, so dass der richtige Ort, wo die Anzahl der span gibt es gibt, aber es gibt 2 Probleme:

  1. Du musst Beiträge dynamisch zählen, also kannst du nicht einfach den HTML-Code schreiben
  2. Selbst wenn Sie den HTML $labels['menu_name'] in die $labels['menu_name'] -Option oder $labels['menu_name'] einfügen, wird der Bereich entfernt, da vor dem Drucken des Menüs der Wert des Parameters in esc_attr

Das zweite “Problem” ist kein wirkliches Problem, es ist die Lösung!

Tatsächlich esc_attr function esc_attr einen Filter hook attribute_escape , mit dem wir die Anzahl der ausstehenden Posts berechnen und dann das richtige html unescaped ausgeben können.

Wir müssen sehr vorsichtig sein, wenn wir die Desinfektionsfunktion von esc_attr entfernen, da dies eine function ist, die oft in WP verwendet wird und eine function ist, die sich auf secutirity bezieht. Also müssen wir das Verhalten nur auf das Admin-Menü und nur im konkreten Fall eingrenzen.

Außerdem können wir den Filter wieder hinzufügen, wenn er seine Arbeit getan hat, auf diese Weise wird er nur einmal entfernt.

Das einzige Problem ist jetzt, wie man den richtigen Menüpunkt erkennt, für den der Filter entfernt und die Zählung hinzugefügt wird.

Die einzige Chance, die wir haben, ist es, eine Art Platzhalter einzufügen, der uns den Menüpunkt erkennen lässt. Mit anderen Worten, wenn Sie Ihr cpt registrieren, müssen Sie einen uncommon String zu $labels['menu_name'] :

 $labels = array( /** This do the magic ;) ! */ 'menu_name' => _x('My CPT %%PENDING_COUNT%%', 'My CPT post type label menu_name', 'mytextdomain'), 'name' => _x('My CPT','My CPT label name','mytextdomain'), 'singular_name' => _x('My CPT','My CPT label singular_name','mytextdomain'), 'all_items' => _x('All My CPT','My CPT label all_items','mytextdomain'), 'add_new' => _x('Add New','My CPT label add_new','mytextdomain'), 'add_new_item' => _x('Add New My CPT','My CPT label add_new_item','mytextdomain'), 'edit_item' => _x('Edit My CPT','My CPT label edit_item','mytextdomain'), 'new_item' => _x('New My CPT','My CPT label new_item','mytextdomain'), 'view_item' => _x('View My CPT','My CPTlabel view_item','mytextdomain'), 'search_items' => _x('Search My CPT','My CPT label search_items','mytextdomain'), 'not_found' => _x('My CPT not found','My CPT label not_found','mytextdomain'), 'not_found_in_trash' => _x('My CPT not found in trash','My CPT label not_found_in_trash','mytextdomain'), 'parent_item_colon' => _x('Parent:','My CPT label parent_item_colon','mytextdomain') ); $args = array( 'labels' => $labels, ... other args here ) register_post_type( 'my_cpt', $args ); 

Sobald der %%PENDING_COUNT%% hinzugefügt wurde, führen wir unsere Arbeit aus, wenn der esc_attr für eine Zeichenfolge esc_attr wird, die diesen Text enthält:

 add_action('auth_redirect', 'add_pending_count_filter'); // modify esc_attr on auth_redirect add_action('admin_menu', 'esc_attr_restore'); // restore on admin_menu (very soon) function add_pending_count_filter() { add_filter('attribute_escape', 'remove_esc_attr_and_count', 20, 2); } function esc_attr_restore() { remove_filter('attribute_escape', 'remove_esc_attr_and_count', 20, 2); } function remove_esc_attr_and_count( $safe_text = '', $text = '' ) { if ( substr_count($text, '%%PENDING_COUNT%%') ) { $text = trim( str_replace('%%PENDING_COUNT%%', '', $text) ); // run only once! remove_filter('attribute_escape', 'remove_esc_attr_and_count', 20, 2); $safe_text = esc_attr($text); // remember to set the right cpt name below $count = (int)wp_count_posts( 'my_cpt', 'readable' )->pending; if ( $count > 0 ) { // we have pending, add the count $text = esc_attr($text) . '' . $count . ''; return $text; } } return $safe_text; } 

Das ist alles und es funktioniert!

Bildbeschreibung hier eingeben

Es gibt nur ein kleines Problem: Wenn ein ausstehender Post über die Schnellbearbeitung veröffentlicht wird, wird die ausstehende Zählung nicht aktualisiert, da die schnelle Bearbeitung ajax verwendet, und um die numebr zu aktualisieren, müssen Sie einige js verwenden. Arbeite daran, wenn du willst.