Bantuan Membuat Jenis Posting Kustom Slide dengan Kotak Meta Kustom?

16

Saya perlu membuat kotak meta kiriman khusus untuk es jenis kiriman saya "Slideshow" (jenis kiriman ini sudah dibuat). Setiap metabox akan menyimpan konten di setiap slide slide dan menyimpannya ke bidang khusus yang sesuai. Setiap metabox harus berisi bidang-bidang berikut:

  • Judul (Bidang Teks)
  • Gambar (Entah Bidang Teks untuk URL img atau idealnya Daftar Dropdown yang menunjukkan gambar mini dari gambar yang dilampirkan pada kiriman)
  • Kode Sematan (Area Teks)
  • Penjelasan (wysiwyg)
  • Sembunyikan Slide (Centang untuk digunakan untuk menyembunyikan slide sementara tanpa menghapusnya)
  • Hapus Slide (tombol yang menghapus isi kolom meta pos yang diisi oleh slide ini)

Saya juga ingin tombol di suatu tempat yang memungkinkan saya untuk "Menambahkan slide" sehingga ketika diklik, itu menambahkan lain "Slide" Custom Meta Box yang merupakan duplikat dari yang pertama tetapi menambahkan nomor tambahan untuk setiap bidang meta posting kustom. Saat ini saya hanya memiliki 15 metabox dan template Slideshow diatur sedemikian rupa sehingga jika hanya 5 dari metabox yang diisi maka hanya 5 slide yang ditampilkan.

Akhirnya, saya ingin dapat memesan ulang slide, baik dengan "Seret dan Jatuhkan" atau dengan Bidang Teks lain tempat saya dapat mengetikkan nomor pesanan.

Saya mendapatkannya hampir di mana saya membutuhkannya dengan plugin "More Fields" dan beberapa bantuan kode dari Rarst. Dengan plugin "More Fields", saya memiliki bidang-bidang berikut di setiap metabox:

  • Judul (Bidang Teks)
  • Gambar (Daftar tarik-turun gambar yang dilampirkan pada pos)
  • Kode Sematan (Area Teks)
  • Penjelasan (wysiwyg)
  • Sembunyikan Slide (Centang untuk digunakan untuk menyembunyikan slide sementara tanpa menghapusnya)

Berikut ini adalah tangkapan layar bagaimana saya membuatnya melalui plugin "More Fields":

teks alternatif

Masalah dengan ini adalah bahwa tidak ada cara untuk menghapus slide setelah dibuat karena "Bidang Lainnya" tidak digunakan di <?php delete_post_meta($post_id, $key, $value); ?>mana pun. Masalah lain dengan plugin ini adalah terlalu tidak dapat diandalkan dan sering rusak dengan pembaruan.

Saya telah mampu menerapkan solusi serupa dengan metabox khusus saya sendiri yang meliputi:

  • Judul (Bidang Teks)
  • Gambar (Bidang Teks untuk URL img)
  • Kode Sematan (Area Teks)
  • Deskripsi (Area Teks)
  • Sembunyikan Slide (Centang untuk digunakan untuk menyembunyikan slide sementara tanpa menghapusnya)

Dengan implementasi ini saya sepertinya tidak bisa mendapatkan beberapa bidang TinyMCE untuk bekerja atau kotak dropdown gambar. Kode TinyMCE tampaknya bekerja sampai saya menambahkan kode yang membuat salinan tambahan dari metabox pertama di mana titik saya mendapatkan error ini tepat di atas lapangan di mana tombol TinyMCE harus: Warning: array_push() [function.array-push]: First argument should be an array....

Juga, saat ini saya bergantung pada penulis saya untuk tahu untuk menaruh video atau gambar pada SETIAP BAIK dan tidak apa-apa, tetapi mungkin lebih baik untuk memiliki tombol radio yang memungkinkan mereka memilih mana yang slide (mungkin default untuk image) yang terikat pada pernyataan tampilan bersyarat dalam template tampilan slide.

Saya menangani pengunggahan gambar melalui kotak "Featured Image" bawaan di sidebar meskipun saya tidak keberatan dengan metabox khusus yang hanya mengatakan "Unggah Gambar" di bagian atas panel tulis.

Pada akhirnya saya mencari tampilan slide yang mirip dengan ini: http://www.nytimes.com/slideshow/2010/08/10/science/20100810angier-1.html . Saya ingin milik saya juga dapat memiliki video sebagai konten dalam slide, bukan gambar. Saya membutuhkan panel Admin yang intuitif dan mudah digunakan untuk penulis saya (mereka tidak terlalu ahli dalam bidang teknologi dan tidak dapat diandalkan menggunakan html dan / atau shortcode). Kalau-kalau itu tidak jelas dari contoh, setiap slide harus menghasilkan tampilan halaman baru.

Penataan ulang Drag'n'Drop bukan prioritas tinggi tetapi akan keren. Saya menemukan sebuah plugin yang menangani ini dengan sangat baik: SlideDeck . Sayangnya plugin tidak sesuai dengan kebutuhan saya tetapi cara mereka menangani pemesanan slide cukup bagus. Ini adalah metabox terpisah di bilah sisi yang memungkinkan Anda menyeret slide ke dalam urutan yang Anda suka. Ini juga cara Anda menambahkan slide, dengan mengklik tombol "Tambahkan Slide" yang menambahkan Metabox Slide lain ke panel tulis. Ini screenshotnya:

teks alternatif

Anda juga dapat melihat lebih banyak tangkapan layar dalam aksi di repositori wordpress .

Ini semua kode saya:

Fungsi-fungsi pengaturan Jenis Posting Slideshow dan Pagination Slideshow: http://loak.pastebin.com/g63Gf186

Kode asli dari DeluxeBloggingTips.com (DBT) tempat saya mendasarkan Metabox saya dari: http://loak.pastebin.com/u9YTQrxf

Versi kode DBT yang saya modifikasi untuk memberi saya versi tambahan dari metabox yang sama: http://loak.pastebin.com/WtxGdPrN

Versi modifikasi dari kode DBT yang dibuat Chris Burbridge untuk memungkinkan beberapa contoh TinyMCE: http://loak.pastebin.com/Mqb3pKhx Dengan kode ini TinyMCE berfungsi.

Modifikasi saya dari kode Burbridge yang mencoba untuk memasukkan peningkatan saya dan bidang yang memungkinkan Anda memilih gambar dari daftar dropdown semua gambar yang dilampirkan pada posting: http://loak.pastebin.com/xSuenJTK Dalam upaya ini, TinyMCE rusak dan dropdown tidak berfungsi.

Ini mungkin tidak masalah tetapi jika Anda bertanya-tanya, ini adalah kode yang saya gunakan untuk menarik kode sematan dari meta pos kustom, ubah ukurannya, dan masukkan di pos: http://loak.pastebin.com / n7pAzEAw

Ini adalah versi yang diedit dari pertanyaan asli untuk mencerminkan status proyek saat ini dan menjawab pertanyaan yang diposting di komentar. Terima kasih kepada Chris_O karena telah memberikan hadiah ini. Juga, terima kasih kepada Rarst dan Justin karena telah membantu saya dengan banyak hal ini di forum ThemeHybrid.com . Saya telah menghabiskan berjam-jam untuk hal ini dan saya mandek (saya menghabiskan beberapa jam sendirian di Pertanyaan ini). Bantuan apa pun akan sangat dihargai.

matt
sumber
Bisakah Anda menggambar gambar simle yang menunjukkan seluruh gambar, seperti sketsa atau lebih? Saya pikir itu membantu untuk lebih memahami kebutuhan Anda.
hakre
Saya menambahkan beberapa contoh di bagian bawah. Jika ini tidak cukup jelas, beri tahu saya.
matt
Apakah masih belum jelas?
matt
Siapa saja? Apakah ini menyala?
matt
@ Hasre, Anda di sana?
matt

Jawaban:

6

Dari hal-hal yang terlihat, taruhan teraman Anda dan rute termudah adalah dengan garpu plugin More Fields khusus untuk penggunaan Anda. Dua fitur terbesar yang saya lihat garpu Anda butuhkan adalah bidang "pabrik" dan antarmuka drag-and-drop.

Banyak Bidang

Saran saya adalah untuk melihat kelas Widget WordPress dan menggunakannya sebagai model untuk pabrik bidang Anda - pada dasarnya, pinjam kemampuan untuk membuat beberapa contoh bidang setelah Anda memiliki kerangka kerja yang dibangun untuk itu.

Ini adalah inti dari bagaimana beberapa widget bekerja di sidebar:

  • Anda menentukan kode untuk setiap widget satu kali dengan memperluas WP_Widgetkelas.
  • Kemudian, Anda dapat membuat salinan widget sebanyak yang Anda inginkan
    • Spesifikasi masing-masing widget disimpan sebagai data bersambung dalam tabel opsi
  • Anda dapat menyesuaikan setiap widget, menghapusnya dengan deleteperintah sederhana , dan mengatur pemosisiannya secara eksplisit melalui antarmuka drag-and-drop Appearance

Seret dan lepas

Sekali lagi, saya sarankan mencari sistem widget WordPress untuk inspirasi. Kami sudah memiliki antarmuka drag-and-drop yang cukup intuitif yang diatur di sana, sehingga akan cukup mudah untuk mengarahkan ulang sebagian besar kode yang sama di tempat lain. Atau, jika Anda ingin menjadi benar-benar mewah, Anda dapat menerapkan sistem seret-dan-jatuhkan sendiri di dalam bidang meta khusus yang terpisah.

Jadi setiap slide akan ditentukan oleh kotak meta khusus yang ditautkan ke pos. Urutan slide akan ditetapkan oleh kotak meta khusus yang juga ditautkan ke pos. Saya akan merekomendasikan mengirim pembaruan slide melalui AJAX sehingga Anda dapat secara dinamis memperbarui kotak meta urutan slide berdasarkan informasi (ini mencegah harus secara manual menekan "pembaruan" dan menunggu halaman untuk memuat ulang sebelum memindahkan hal-hal di sekitar).

jQuery UI memiliki antarmuka " draggable " yang hebat yang dapat dengan mudah Anda manipulasi untuk keperluan Anda di dalam kotak meta khusus ini. Bagian yang sulit bukanlah membangun antarmuka, melainkan mendapatkan komunikasi yang konsisten dan akurat antara kotak meta dan kumpulan kotak meta slide di tempat lain pada halaman.

Singkatnya

Apa yang saya kumpulkan dari pos Anda adalah bahwa Anda memiliki solusi yang bisa diterapkan:

  • Anda telah menambahkan 15 bidang khusus ke jenis pos kustom melalui widget More Fields tetapi ingin menambahkan / menghapus bidang secara dinamis daripada bekerja dengan nomor yang ditetapkan
  • Anda ingin cara untuk menyesuaikan urutan bidang khusus ini agar slide memuat secara berurutan

Cara saya mendekati ini adalah dengan mengabstraksi proses pembuatan meta khusus ke kelas yang dapat saya gunakan berulang-ulang untuk membuat bidang meta khusus baru. Lalu saya akan memperluas kelas untuk menginisialisasi dua jenis kotak meta: satu untuk slide, satu untuk struktur slide. Saya juga membangun ke dalam kotak meta struktur slide kemampuan untuk secara dinamis membuat kotak meta slide baru (kotak meta slide akan menampung tindakan "hapus" mereka sendiri).

Seluruh tampilan slide akan disimpan bukan oleh kotak meta slide, tetapi oleh kotak geser struktur meta ke dalam bidang meta khusus untuk posting - meta khusus akan menjadi array yang bergerigi, dengan masing-masing slide diwakili sebagai array di dalamnya - di memesan . Menyesuaikan urutan rangkai salindia dalam kotak meta struktur akan mengatur ulang larik dan menyimpan kembali meta pos. Dengan cara ini saya hanya memiliki 1 meta nilai untuk dibaca kembali ketika saya ingin mengakses slideshow.

Antara SlideDeck, More Fields, dan kode khusus yang telah Anda buat sejauh ini, Anda sudah memiliki sebagian besar solusi Anda ... Anda hanya perlu membuat semuanya bekerja bersama pada saat yang sama. Saya akan fokus pada implementasi root terlebih dahulu sebelum menambahkan hiasan JavaScript - secara dinamis membuat, memodifikasi, menyimpan, dan menghapus slide lebih penting daripada editor teks kaya, IMO. Dapatkan itu retak dulu. Kemudian turunkan sistem pemesanan. Kemudian Anda bisa fokus untuk mendapatkan beberapa instance TinyMCE yang bekerja di halaman.

EAMann
sumber
Terima kasih untuk bantuannya! Pada saat ini ini sedikit keluar dari keahlian saya tetapi akan berfungsi sebagai panduan yang baik melalui proses pembelajaran. Saya menyadari "kelas" dan menyadari bahwa saya sudah menggunakan kelas pada kode metabox tetapi saya masih belum memahaminya. Hal lain yang saya "sadari" tetapi tidak sepenuhnya mengerti adalah penggunaan array.
matt
Saran Anda tentang menurunkan fundamental adalah masuk akal, tetapi saya menghadapi beberapa kendala dunia nyata yang mengharuskan saya memasukkan ini ke lingkungan produksi secepatnya dan salah satu faktor terpenting adalah editor wysiwyg karena banyak penulis sangat non-teknis. . Saya tidak keberatan membuat proyek tambahan dan bergantung pada kruk di sepanjang jalan tetapi pendekatan ini jelas perlu scalable. Yang mengatakan kepada saya bahwa menggunakan plugin "lebih banyak bidang" dapat berfungsi sebagai solusi sementara sampai saya mengetahuinya, tetapi saya tidak yakin itu akan berhasil dengan ...
matt
pendekatan Anda menyimpan seluruh tayangan slide dalam satu bidang khusus. Apakah Anda benar-benar berpikir bahwa menempatkan semuanya dalam satu bidang lebih baik? Ini mungkin terdengar bodoh tetapi bagi saya tampaknya ada lebih banyak ruang untuk kesalahan jika wp harus menulis ulang seluruh tampilan slide setiap kali perubahan kecil dibuat.
matt
Menyimpan seluruh tampilan ke satu bidang meta mencegah dan memperkenalkan masalah: Menghemat waktu di situs presentasi dengan tidak memaksa Anda untuk memilih, membaca, dan mengulang-ulang beberapa bidang. Namun, jika ada yang pecah dalam satu slide dan ditulis ke DB itu akan merusak keseluruhan slide show. Benar-benar tradeoff, tapi saya selalu memilih kecepatan dan kemudahan pengembangan.
EAMann
Apakah Anda mengatakan bahwa itu menghemat waktu di ujung depan situs? Mengapa itu terjadi jika hanya menampilkan satu slide sekaligus?
matt