Update-Benachrichtigungsblase zum Admin-Menüpunkt hinzufügen?


9

Ich habe dies umformuliert, um mehr Sinn zu machen.

Ok, ich habe ein Plugin, das einen Remote-Dienst verwendet, der nach Updates sucht, ähnlich wie Standard-WordPress-Plugins. In diesem Fall überprüft es nur eine XML-Datei.

Ich möchte eine solche Menüblase anzeigen, Geben Sie hier die Bildbeschreibung einwenn ein Update verfügbar ist.

Es kann nur eine "1" oder einen Text wie "alert" anzeigen, es spielt keine Rolle.

Da mein Plugin eine Optionsseite verwendet (mit add_options_page), werden die Plugin-Einstellungen im Standard-Untermenü "Einstellungen" angezeigt.

Ich denke, ich muss das folgende CSS hinzufügen, damit die Blase angezeigt wird.

<span class='update-plugins count-1' title='title'><span class='update-count'>1</span></span>

und binden in die globale $submenu. Das Problem ist, dass ich keinen fest codierten Array-Wert für das Menü verwenden kann, da jede Site unterschiedliche Werte hat.

Also kann ich nicht verwenden $submenu[80][10] .= <span class='update-plugins count-1' title='title'><span class='update-count'>1</span></span>

Wie finde ich den Wert meines Plugins-Untermenüs? Muss ich das Array durchlaufen und die Zeichenfolgenwerte abgleichen?

Auch wenn ich die Werte fest codiert habe, konnte ich die Blase nicht zum Anzeigen bringen.

//adding plugin to menu
add_action('admin_menu', 'sec_plugin_checker');

function sec_plugin_checker() {
  add_options_page(' Plugin Checker', 'Plugin Check', 'activate_plugins', 
  'sec_plugin_check', 'sec_checker');


// the conditional where I want the bubble to appear

if (!empty($matches)){ 
    echo "Match found !<br />";

    global $submenu;
    foreach( $submenu as $item ) {

    $item[41][20] = sprintf( __( 'Updates %s', 'sec_plugin_checker' ),  
                "<span class='update-plugins count-1' title='title'>
                 <span class='update-count'>1</span></span>");  

       }
  }

und so var_dump($submenu);sieht ein aus,

["options-general.php"]=>
array(9){
...

[41]=>
    array(4) {
      [0]=>
      string(20) "Plugin Check"
      [1]=>
      string(16) "activate_plugins"
      [2]=>
      string(21) "sec_plugin_check"
      [3]=>
      string(23) " Plugin Checker"

     ...

      }

Was ist der Grund dafür? Was genau möchten Sie tun?
Ján Bočínec

1
@ Wyck: Sie sprechen von der Blase, die die Anzahl der verfügbaren Updates und nicht moderierten Kommentare angibt ? Vielleicht sollten Sie Ihre Frage so aktualisieren, dass sie einen Screenshot enthält, um dies klarer zu machen.
Jan Fabry

Ja genau, ich werde den Bildschirm hinzufügen.
Wyck

Wofür genau möchten Sie verfügbare Updates angeben? Für von WPORG-Repositorys gehostete Designs und Plugins wird diese Update-Benachrichtigung automatisch verarbeitet.
Chip Bennett

Es ist eine benutzerdefinierte Funktion für ein Plugin, die Remote-Updates von einem anderen Dienst erhält, und ich möchte dieselbe Update-Benachrichtigungsfunktion verwenden.
Wyck

Antworten:


8

Ich würde das tun, wenn Sie anrufen add_options_page(), nicht später. Es ist immer besser, dies mit der unterstützten API zu tun, als mit den internen Strukturen zu spielen.

Der Plugin-Updater überprüft regelmäßig den Plugin-Status und speichert das Ergebnis in einem Übergang . Dies bedeutet, dass dieser zwischengespeicherte Status nur beim Erstellen des Menüs gelesen wird und nicht bei jedem Laden der Seite die vollständige Überprüfung durchgeführt wird. Sie können etwas Ähnliches tun:

add_action( 'admin_menu', 'wpse15567_admin_menu' );
function wpse15567_admin_menu()
{
    $warnings = get_transient( 'wpse15567_warnings' );
    $warning_count = count( $warnings );
    $warning_title = esc_attr( sprintf( '%d plugin warnings', $warning_count ) );

    $menu_label = sprintf( __( 'Plugin Checker %s' ), "<span class='update-plugins count-$warning_count' title='$warning_title'><span class='update-count'>" . number_format_i18n($warning_count) . "</span></span>" );

    add_options_page( 'Plugin Check', $menu_label, 'activate_plugins', 'sec_plugin_check', 'sec_checker' );
}

Menüpunkt mit Benachrichtigungsblase

Wenn Sie die eigentliche Warnprüfung durchführen, speichern Sie die Ergebnisse im Transienten, damit sie später gelesen werden können:

if ( ! empty( $matches ) ) {
    set_transient( 'wpse15567_warnings', $matches );
}

Beachten Sie, dass ich nichts Besonderes mache, wenn keine Warnungen vorliegen. Die Blase wird nicht angezeigt, weil sie die Klasse erhält count-0, die display: nonein der CSS enthalten ist .


1
Perfekt! Vielen Dank, dies ist ein viel besserer Weg, dies zu tun.
Wyck
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.