Tambahkan gelembung pemberitahuan pembaruan ke item menu admin?

9

Saya telah mengatakan kembali ini agar lebih masuk akal.

Ok, saya punya plugin yang menggunakan layanan jarak jauh yang memeriksa pembaruan, sama seperti plugin WordPress default, dalam hal ini hanya memeriksa file XML.

Saya ingin menampilkan gelembung menu seperti ini masukkan deskripsi gambar di siniketika pembaruan tersedia.

Itu dapat menunjukkan hanya "1" atau teks seperti "lansiran", itu tidak masalah.

Karena plugin saya menggunakan halaman opsi (menggunakan add_options_page) pengaturan plugin muncul di bawah submenu "Pengaturan" default.

Saya pikir saya perlu menambahkan CSS berikut untuk mendapatkan gelembung muncul,

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

dan mengikat ke global $submenu. Masalahnya adalah saya tidak dapat menggunakan nilai array kode-keras untuk menu karena setiap situs akan memiliki nilai yang berbeda.

Jadi saya tidak bisa menggunakan $submenu[80][10] .= <span class='update-plugins count-1' title='title'><span class='update-count'>1</span></span>

Bagaimana saya bisa menemukan nilai submenu plugin saya, apakah saya harus mengulang array dan mencocokkan nilai string?

Bahkan ketika saya membuat hard-coded nilai-nilai saya tidak bisa membuat gelembung muncul.

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

       }
  }

dan inilah yang var_dump($submenu);terlihat seperti,

["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
sumber
Apa alasannya? Apa sebenarnya yang ingin Anda lakukan?
Ján Bočínec
1
@Wyck: Anda berbicara tentang gelembung yang menunjukkan jumlah pembaruan yang tersedia dan komentar yang tidak dimoderasi ? Mungkin Anda harus memperbarui pertanyaan Anda untuk menyertakan tangkapan layar, untuk membuatnya lebih jelas.
Jan Fabry
Ya persis, saya akan menambahkan layar.
Wyck
Untuk apa, tepatnya, yang Anda inginkan untuk menunjukkan pembaruan yang tersedia? untuk Tema dan Plugin yang diinangi oleh repositori WPORG, pemberitahuan pembaruan ini ditangani secara otomatis.
Chip Bennett
Ini adalah fungsi khusus untuk sebuah plugin, yang mendapat pembaruan jarak jauh dari layanan lain, dan saya ingin menggunakan fungsi pemberitahuan pembaruan yang sama.
Wyck

Jawaban:

8

Saya akan melakukan ini ketika Anda menelepon add_options_page(), bukan nanti. Itu selalu lebih baik untuk melakukan ini dengan API yang didukung daripada bermain dengan struktur internal.

Plugin updater secara berkala memeriksa status plugin dan kemudian menyimpan hasilnya dalam transient . Ini berarti bahwa itu hanya membaca status cache ini ketika menu dibuat, itu tidak melakukan pemeriksaan penuh pada setiap halaman memuat. Anda dapat melakukan hal serupa:

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 menu dengan gelembung notifikasi

Ketika Anda melakukan pemeriksaan peringatan yang sebenarnya, Anda menyimpan hasilnya dalam transient sehingga dapat dibaca nanti:

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

Perhatikan bahwa saya tidak melakukan sesuatu yang istimewa ketika tidak ada peringatan. Gelembung tidak ditampilkan karena mendapat kelas count-0, yang ada display: nonedi css .

Jan Fabry
sumber
1
Sempurna! Terima kasih ini cara yang lebih baik untuk melakukan ini.
Wyck