web-dev-qa-db-fra.com

Ajouter une bulle de notification de mise à jour à l'élément de menu de l'administrateur?

J'ai reformulé cela pour donner plus de sens.

Ok, j'ai un plugin qui utilise un service distant qui vérifie les mises à jour, un peu comme les plugins WordPress par défaut, dans ce cas, il ne vérifie qu'un fichier XML.

Je veux montrer une bulle de menu comme celle-ci enter image description here lorsqu'une mise à jour est disponible.

Il peut afficher juste un "1" ou un texte du type "alerte", peu importe.

Étant donné que mon plug-in utilise une page d'options (en utilisant add_options_page), les paramètres du plug-in s'affichent dans le sous-menu par défaut "Paramètres".

Je pense que j'ai besoin d'ajouter le CSS suivant pour que la bulle apparaisse,

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

et lier dans le $submenu global. Le problème est que je ne peux pas utiliser une valeur de tableau codé en dur pour le menu car chaque site aura des valeurs différentes.

Donc je ne peux pas utiliser $submenu[80][10] .= <span class='update-plugins count-1' title='title'><span class='update-count'>1</span></span>

Comment trouver la valeur de mon sous-menu plugins, dois-je parcourir le tableau et faire correspondre les valeurs de chaîne?

De plus, même lorsque j'ai codé en dur les valeurs, je ne pouvais pas faire apparaître la bulle.

//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>");  

       }
  }

et voici à quoi ressemble var_dump($submenu);,

["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"

     ...

      }
8
Wyck

Je le ferais lorsque vous appelez add_options_page(), pas plus tard. Il est toujours préférable de faire cela avec l'API prise en charge plutôt que de jouer avec les structures internes.

Le programme de mise à jour du plugin vérifie périodiquement son statut, puis enregistre le résultat dans un transitoire . Cela signifie que il ne lit que cet état mis en cache lorsque le menu est créé, il ne fait pas la vérification complète à chaque chargement de page. Vous pouvez faire quelque chose de similaire:

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' );
}

Menu item with notification bubble

Lorsque vous effectuez la vérification d'avertissement réelle, vous enregistrez les résultats dans le transitoire afin qu'il puisse être lu ultérieurement:

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

Notez que je ne fais rien de spécial quand il n'y a pas d'avertissement. La bulle ne s'affiche pas car elle obtient la classe count-0, qui a display: none dans le fichier css .

7
Jan Fabry