Dodać dymek powiadomienia o aktualizacji do pozycji menu administratora?

9

Przeredagowałem to, aby było bardziej sensowne.

Ok, mam wtyczkę, która korzysta ze zdalnej usługi, która sprawdza dostępność aktualizacji, podobnie jak domyślne wtyczki WordPress, w tym przypadku po prostu sprawdza plik XML.

Chcę pokazać taką bańkę menu, wprowadź opis zdjęcia tutajgdy dostępna jest aktualizacja.

Może wyświetlać tylko „1” lub tekst przypominający „alert”, nie ma to znaczenia.

Ponieważ moja wtyczka korzysta ze strony opcji (za pomocą add_options_page), ustawienia wtyczki są wyświetlane w domyślnym podmenu „Ustawienia”.

Myślę, że muszę dodać następujący CSS, aby pojawił się dymek,

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

i związać się z globalnym $submenu. Problem polega na tym, że nie mogę użyć zakodowanej wartości tablicy dla menu, ponieważ każda witryna będzie miała inne wartości.

Więc nie mogę użyć $submenu[80][10] .= <span class='update-plugins count-1' title='title'><span class='update-count'>1</span></span>

Jak znaleźć wartość podmenu wtyczek, czy muszę przeglądać tablicę i dopasowywać wartości ciągu?

Nawet gdy zakodowałem na stałe wartości, nie mogłem wyświetlić bańki.

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

       }
  }

a oto jak var_dump($submenu);wygląda

["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
źródło
Jaki jest tego powód? Co dokładnie chcesz zrobić?
Ján Bočínec,
1
@ Wyck: Mówisz o bańce, która wskazuje liczbę dostępnych aktualizacji i niemoderowanych komentarzy ? Być może powinieneś zaktualizować swoje pytanie, dodając zrzut ekranu, aby to wyjaśnić.
Jan Fabry,
Tak, dokładnie dodam ekran.
Wyck
Na co dokładnie chcesz wskazać dostępne aktualizacje? w przypadku motywów i wtyczek hostowanych w repozytorium WPORG powiadomienie o aktualizacji jest obsługiwane automatycznie.
Chip Bennett
To niestandardowa funkcja wtyczki, pobiera ona zdalne aktualizacje z innej usługi i chcę korzystać z tej samej funkcji powiadamiania o aktualizacji.
Wyck

Odpowiedzi:

8

Zrobiłbym to, kiedy zadzwonisz add_options_page(), nie później. Zawsze lepiej jest to zrobić z obsługiwanym interfejsem API zamiast bawić się strukturami wewnętrznymi.

Aktualizator wtyczek okresowo sprawdza status wtyczki, a następnie zapisuje wynik w stanie przejściowym . Oznacza to, że odczytuje ten status z pamięci podręcznej tylko podczas tworzenia menu, nie wykonuje pełnego sprawdzenia przy każdym ładowaniu strony. Możesz zrobić coś podobnego:

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

Element menu z dymkiem powiadomienia

Kiedy wykonujesz rzeczywiste sprawdzenie ostrzeżenia, zapisujesz wyniki w stanie przejściowym, aby można je było później odczytać:

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

Zauważ, że nie robię nic specjalnego, gdy nie ma ostrzeżeń. Bańka nie jest wyświetlana, ponieważ dostaje klasę count-0, która ma display: nonew css .

Jan Fabry
źródło
1
Doskonały! Dzięki temu jest to znacznie lepszy sposób na zrobienie tego.
Wyck