Saya telah memposting laporan bug tentang ini beberapa bulan yang lalu ( di WordPress trac (Widget Instance Form Update Bug) ) dan saya pikir saya akan mencoba menulisnya juga di sini. Mungkin seseorang memiliki solusi yang lebih baik untuk masalah ini daripada saya.
Pada dasarnya masalahnya adalah bahwa jika Anda menjatuhkan widget ke bilah sisi, bentuk widget tidak diperbarui sampai Anda secara manual menekan save (atau memuat ulang halaman).
Ini membuat semua kode dari form()
fungsi yang tidak dapat digunakan bergantung pada ID instance widget untuk melakukan sesuatu (sampai Anda menekan tombol simpan). Segala hal seperti permintaan ajax, hal-hal jQuery seperti colorpickers dan sebagainya tidak akan langsung berfungsi, karena dari fungsi itu akan tampak bahwa instance widget belum diinisialisasi.
Perbaikan kotor akan memicu tombol simpan secara otomatis menggunakan sesuatu seperti livequery :
$("#widgets-right .needfix").livequery(function(){
var widget = $(this).closest('div.widget');
wpWidgets.save(widget, 0, 1, 0);
return false;
});
dan tambahkan .needfix
kelas form()
jika instance widget tidak terlihat diinisialisasi:
<div <?php if(!is_numeric($this->number)): ?>class="needfix"<?php endif; ?>
...
</div>
Salah satu kelemahan dari solusi ini adalah bahwa jika Anda memiliki banyak widget terdaftar, browser akan memakan banyak CPU, karena livequery memeriksa perubahan DOM setiap detik (tho saya tidak secara khusus menguji ini, itu hanya asumsi saya :)
Ada saran untuk cara yang lebih baik untuk memperbaiki bug?
sumber
Jawaban:
Saya melakukan pertempuran dengan situasi yang sama baru-baru ini. Ajax di widget bukan lelucon! Perlu menulis beberapa kode yang cukup gila untuk menyelesaikan berbagai hal. Saya tidak terbiasa dengan kueri langsung, tetapi jika Anda mengatakan itu memeriksa DOM setiap detik, saya mungkin memiliki solusi yang kurang intens untuk Anda:
Anda bisa melewatkan fungsi ini sebagai pemilih atau objek jQuery dan itu akan mengembalikan ID instance dari instance saat ini. Saya tidak dapat menemukan cara lain untuk mengatasi masalah ini. Senang mendengar saya bukan satu-satunya :)
sumber
Saya tidak suka menjawab pertanyaan saya sendiri, tetapi saya merasa ini adalah solusi terbaik sejauh ini:
Ini akan mengaktifkan permintaan widget-save ajax, tepat setelah permintaan widget-save selesai (jika tidak ada respons dengan formulir html).
Perlu ditambahkan dalam
jQuery(document).ready()
fungsi.Sekarang, jika Anda ingin dengan mudah melampirkan kembali fungsi javascript Anda ke elemen DOM baru yang ditambahkan oleh fungsi bentuk widget cukup ikatkan ke acara "Saved_widget":
sumber
Mengalami hal ini baru-baru ini dan tampaknya dalam antarmuka "widgets.php" tradisional, inisialisasi javascript apa pun harus dijalankan langsung untuk widget yang ada (yang ada di
#widgets-right
div), dan secara tidak langsung melaluiwidget-added
acara untuk widget yang baru ditambahkan; sedangkan di antarmuka customizer "custom.php" semua widget - yang ada dan yang baru - dikirimwidget-added
acara sehingga hanya dapat diinisialisasi di sana. Berdasarkan ini berikut ini adalah perpanjangan dariWP_Widget
kelas yang membuatnya mudah untuk menambahkan inisialisasi javascript untuk bentuk widget ini dengan menimpa satu fungsi,form_javascript_init()
:Contoh widget uji menggunakan ini:
sumber
Saya pikir ada sesuatu di Wordpress 3.9 yang mungkin membantu Anda. Ini adalah callback yang diperbarui widget . Gunakan seperti ini (naskah kopi):
sumber