Добавить уведомление об обновлении в пункт меню администратора?

9

Я переформулировал это, чтобы иметь больше смысла.

Хорошо, у меня есть плагин, который использует удаленный сервис, который проверяет наличие обновлений, так же, как плагины WordPress по умолчанию, в этом случае он просто проверяет файл XML.

Я хочу показать всплывающее меню, как это, введите описание изображения здеськогда доступно обновление.

Он может показывать только «1» или текст, как «предупреждение», это не имеет значения.

Поскольку мой плагин использует страницу настроек (используя add_options_page), настройки плагина отображаются в подменю «Настройки» по умолчанию.

Я думаю, что мне нужно добавить следующий CSS, чтобы пузырь появился,

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

и привязать к глобальному $submenu. Проблема в том, что я не могу использовать жестко запрограммированное значение массива для меню, поскольку каждый сайт будет иметь разные значения.

Поэтому я не могу использовать $submenu[80][10] .= <span class='update-plugins count-1' title='title'><span class='update-count'>1</span></span>

Как мне найти значение подменю моих плагинов, нужно ли циклически проходить по массиву и сопоставлять строковые значения?

Кроме того, даже когда я жестко закодировал значения, я не мог заставить пузырь появляться.

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

       }
  }

и вот как 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"

     ...

      }
Уик
источник
Что является причиной этого? Что именно вы хотите сделать?
Ян Бочинец
1
@Wyck: Вы говорите о пузыре, который указывает количество доступных обновлений и немодерируемых комментариев ? Может быть, вы должны обновить свой вопрос, чтобы включить скриншот, чтобы сделать это более понятным.
Ян Фабри
Да, точно, я добавлю экран.
Wyck
Для чего именно вы хотите указать доступные обновления? для тем и плагинов, размещенных в репозитории WPORG, это уведомление об обновлении обрабатывается автоматически.
Чип Беннет
Это пользовательская функция для плагина, он получает удаленные обновления от другой службы, и я хочу использовать ту же функцию уведомления об обновлениях.
Вик

Ответы:

8

Я бы сделал это, когда ты позвонишь add_options_page(), а не позже. Всегда лучше делать это с поддерживаемым API, а не играть с внутренними структурами.

Средство обновления плагина периодически проверяет состояние плагина, а затем сохраняет результат в переходном процессе . Это означает, что он читает это кэшированное состояние только при создании меню, он не выполняет полную проверку при каждой загрузке страницы. Вы можете сделать что-то подобное:

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

Пункт меню с уведомлением

Когда вы делаете фактическую проверку предупреждений, вы сохраняете результаты в переходном процессе, чтобы их можно было прочитать позже:

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

Обратите внимание, что я не делаю ничего особенного, когда нет предупреждений. Пузырь не отображается, потому что он получает класс count-0, который есть display: noneв CSS .

Ян Фабри
источник
1
Отлично! Спасибо, это гораздо лучший способ сделать это.
Wyck