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

9

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 vérifie simplement un fichier XML.

Je souhaite afficher une bulle de menu comme celle-ci entrez la description de l'image icilorsqu'une mise à jour est disponible.

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

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

Je pense que je dois ajouter le CSS suivant pour faire apparaître la bulle,

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

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

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

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

Même lorsque j'ai codé en dur les valeurs, je n'ai pas pu 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 var_dump($submenu);ça ressemble,

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

     ...

      }
Wyck
la source
Quelle est la raison pour ça? Que voulez-vous faire exactement?
Ján Bočínec
1
@Wyck: Vous parlez de la bulle qui indique le nombre de mises à jour disponibles et de commentaires non modérés ? Vous devriez peut-être mettre à jour votre question pour inclure une capture d'écran, pour que ce soit plus clair.
Jan Fabry
Oui exactement, je vais ajouter l'écran.
Wyck
Pour quoi, exactement, souhaitez-vous indiquer les mises à jour disponibles? pour les thèmes et plugins hébergés par le référentiel WPORG, cette notification de mise à jour est gérée automatiquement.
Chip Bennett
C'est une fonction personnalisée pour un plugin, il obtient des mises à jour à distance d'un autre service et je veux utiliser la même fonctionnalité de notification de mise à jour.
Wyck

Réponses:

8

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

Le programme de mise à jour du plugin vérifie périodiquement l'état du plugin, puis enregistre le résultat dans un transitoire . Cela signifie qu'il ne lit cet état mis en cache que 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' );
}

Élément de menu avec bulle de notification

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

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

Notez que je ne fais rien de spécial en l'absence d'avertissement. La bulle ne s'affiche pas car elle obtient la classe count-0, qui a display: nonedans le CSS .

Jan Fabry
la source
1
Parfait! Merci, c'est une bien meilleure façon de procéder.
Wyck