Adicionar balão de notificação de atualização ao item de menu administrador?

9

Eu reformulei isso para fazer mais sentido.

Ok, eu tenho um plug-in que usa um serviço remoto que verifica se há atualizações, assim como os plug-ins padrão do WordPress, neste caso, apenas verifica um arquivo XML.

Quero mostrar um balão de menu como este insira a descrição da imagem aquiquando uma atualização estiver disponível.

Pode mostrar apenas um "1" ou texto como "alerta", não importa.

Como meu plug-in usa uma página de opções (usando add_options_page), as configurações do plug-in aparecem no submenu padrão "Configurações".

Acho que preciso adicionar o seguinte CSS para que a bolha apareça,

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

e amarrar no global $submenu. O problema é que não posso usar um valor de matriz codificado para o menu, pois cada site terá valores diferentes.

Então eu não posso usar $submenu[80][10] .= <span class='update-plugins count-1' title='title'><span class='update-count'>1</span></span>

Como posso encontrar o valor do submenu de meus plugins, preciso percorrer a matriz e corresponder aos valores da string?

Além disso, mesmo quando codifiquei os valores, não consegui que a bolha aparecesse.

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

       }
  }

e aqui está o que var_dump($submenu);parece,

["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
fonte
Qual é a razão para isto? O que exatamente você quer fazer?
Ján Bočínec
11
@ Wyck: Você está falando sobre a bolha que indica o número de atualizações disponíveis e comentários moderados ? Talvez você deva atualizar sua pergunta para incluir uma captura de tela, para deixar isso mais claro.
Jan Fabry
Sim exatamente, vou adicionar a tela.
26511 Wyck
Para o que exatamente você deseja indicar as atualizações disponíveis? para Temas e Plugins hospedados no repositório WPORG, esta notificação de atualização é tratada automaticamente.
Chip Bennett
É uma função personalizada para um plug-in, recebe atualizações remotas de outro serviço e eu quero usar a mesma funcionalidade de notificação de atualização.
21411 Wyck

Respostas:

8

Eu faria isso quando você ligar add_options_page(), não mais tarde. É sempre melhor fazer isso com a API suportada em vez de brincar com as estruturas internas.

O atualizador do plug-in verifica periodicamente o status do plug-in e salva o resultado em um transitório . Isso significa que ele só lê esse status em cache quando o menu é criado, não faz a verificação completa em cada carregamento de página. Você pode fazer algo semelhante:

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

Item de menu com balão de notificação

Ao fazer a verificação de aviso real, você salva os resultados no transitório para que possam ser lidos mais tarde:

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

Observe que eu não faço nada de especial quando não há avisos. A bolha não são exibidas porque ele recebe a classe count-0, que tem display: noneno css .

Jan Fabry
fonte
11
Perfeito! Obrigado, esta é uma maneira muito melhor de fazer isso.
Wyck