Додати міхур повідомлення про оновлення до пункту меню адміністратора?


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"

     ...

      }

У чому причина цього? Що саме ти хочеш зробити?
Ján Bočínec

1
@Wyck: Ви говорите про міхур, який вказує кількість доступних оновлень та немодерованих коментарів ? Можливо, вам слід оновити своє питання, щоб включити скріншот, щоб зробити це більш зрозумілим.
Ян Фабрі

Так, я додам екран.
Вік

Для чого саме ви хочете вказати наявні оновлення? для тем і плагінів, розміщених у сховищі WPORG, це повідомлення про оновлення обробляється автоматично.
Чіп Беннетт

Це спеціальна функція для плагіна, вона отримує віддалені оновлення від іншої служби, і я хочу використовувати ту саму функцію оповіщення про оновлення.
Wyck

Відповіді:


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
Ідеально! Дякую, це набагато кращий спосіб зробити це.
Вік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.