Masalah saya sebenarnya agak rumit, jadi saya akan mencoba di sini untuk abstrak dan menjaganya tetap sederhana.
Saya sedang mengerjakan aplikasi khusus berdasarkan WordPress. Saya mendaftarkan jenis posting khusus, sebut saja "orang" tempat saya menyimpan informasi tentang ... orang.
CPT hanya mendukung judul posting dan kolom standar konten posting, tetapi ada beberapa metabox untuk menyimpan informasi orang (anggap aplikasi saya sebagai buku alamat).
Jadi ada metabox untuk menyimpan info pribadi, satu untuk menyimpan info jejaring sosial, yang lain untuk menyimpan info terkait pekerjaan, yaitu jika orang itu bagi saya pelanggan, pemasok, jika kita memiliki kredit atau debit ...
Saya menyederhanakan di sini, tetapi ada sejumlah metabox yang konsisten, katakanlah 12.
Masalah saya adalah, beberapa orang yang ingin saya simpan info hanyalah kontak acak, dan saya ingin menyimpan hanya info pribadi, yang lain adalah teman dan saya ingin menyimpan info pribadi dan info jejaring sosial, lainnya adalah pelanggan atau pemasok dan saya ingin menyimpan info terkait pekerjaan.
Jika ketika mengedit posting saya menyembunyikan (melalui menu opsi layar ) atau menutup metabox yang tidak saya butuhkan, ketika saya membuka posting lain di mana saya membutuhkannya saya harus menunjukkan atau membukanya lagi. Itu karena posisi / status / pesanan metabox disimpan berdasarkan per pengguna sebagai metadata pengguna .
Jika Anda membayangkan di beberapa posting saya perlu 2 metabox, di beberapa 10 dan di 5, Anda mengerti itu menjengkelkan karena menjaga semua yang ditampilkan / terbuka membuat layar edit rendah dapat diakses (scrollbar sepertinya tak ada habisnya), dan kadang-kadang info yang saya cari adalah di akhir halaman setelah sekelompok metabox tanpa info ...
Pertanyaan:
Apakah mungkin untuk menyimpan posisi / status / pesanan metabox berdasarkan per-posting untuk jenis posting tertentu?
PS: Saya tahu beberapa js / jQuery dapat mengatasi masalah ini, tetapi jika memungkinkan saya akan menghindari solusi javascript.
'get_user_option_*_post'
untuk membuat WP mengenali data khusus. Hanya saya pikir saya tidak terlalu suka penggunaanwp_get_referer
itu pada$_SERVER
var yang tidak benar-benar dapat diandalkan tapi saya pikir saya punya ide untuk mengatasi "masalah utama";)wp_get_referer()
metode ini, itu sebabnya saya menyebutnya solusi PHP yang tidak elegan ;-) Saya pertama kali berpikir untuk menyimpan id posting saat ini untuk setiap pengguna, tetapi itu tidak berfungsi jika pengguna mengedit dua atau lebih posting di browser. Nantikan mendengar ide Anda tentang "masalah utama" Nikmati akhir pekan ;-)Seperti yang ditunjukkan oleh birgire dalam jawabannya , WordPress menggunakan AJAX untuk memperbarui status metabox dan data yang diteruskan dalam permintaan AJAX tidak termasuk pos id, dan itu membuatnya sulit untuk memperbarui status kotak berdasarkan basis per-posting.
Setelah saya menemukan tindakan AJAX yang digunakan oleh WordPress
'closed-postboxes'
, saya mencari string ini di folder admin js untuk menemukan bagaimana WordPress membuat permintaan AJAX.Saya menemukan itu terjadi pada
postbox.js
baris # 118 .Sepertinya:
Pada dasarnya, WordPress melihat item DOM dengan kelas 'kotak pos' dan kelas 'tertutup' dan membuat daftar ID yang dipisahkan koma. Hal yang sama dilakukan untuk item DOM tersembunyi dengan kelas 'kotak pos'.
Jadi, pikiran saya adalah: Saya dapat membuat metabox palsu yang memiliki kelas yang tepat dan yang disembunyikan, mengatur id-nya untuk berisi ID posting, dan dengan cara ini saya dapat mengambilnya dalam permintaan AJAX.
Inilah yang telah saya lakukan:
Dengan cara ini saya membuat metabox yang selalu tertutup dan selalu disembunyikan, jadi WordPress akan mengirimkan ID-nya sebagai
$_POST
var dalam permintaan AJAX, dan begitu id kotak palsu berisi ID pos dengan cara yang dapat diprediksi, saya dapat mengenali pos tersebut.Setelah itu saya melihat bagaimana WordPress melakukan tugas AJAX.
Pada
admin-ajax.php
baris 72 , WordPress terhubung'wp_ajax_closed-postboxes'
dengan prioritas 1.Jadi, untuk bertindak sebelum WordPress, saya dapat mengaitkan tindakan yang sama dengan prioritas 0.
Setelah data disimpan dalam meta pos memungkinkan untuk memfilter
get_user_option_closedpostboxes_mycpt
danget_user_option_metaboxhidden_mycpt
(keduanya variasiget_user_option_{$option}
filter) untuk memaksa opsi pemuatan WordPress dari meta pos:dan
sumber