Saya merilis sebuah plugin yang membuat kode pendek dan membutuhkan file JavaScript dan file CSS untuk memuat pada halaman apa pun yang berisi kode pendek itu. Saya hanya bisa membuat skrip / gaya memuat di semua halaman, tapi itu bukan praktik terbaik. Saya hanya ingin memuat file pada halaman yang memanggil kode pendek. Saya telah menemukan dua metode untuk melakukan ini, tetapi keduanya memiliki masalah.
Metode 1 menetapkan bendera menjadi true di dalam fungsi penangan kode pendek, dan lalu memeriksa nilai itu di dalam wp_footer
panggilan balik. Jika benar, ini digunakan wp_print_scripts()
untuk memuat JavaScript. Masalahnya adalah ini hanya berfungsi untuk JavaScript dan bukan CSS, karena CSS harus dideklarasikan di dalamnya <head>
, yang hanya dapat Anda lakukan pada hook awal seperti init
atau wp_head
.
Metode 2 diaktifkan lebih awal dan "mengintip ke depan" untuk melihat apakah kode pendek ada di konten halaman saat ini. Saya suka metode ini jauh lebih baik daripada yang pertama, tetapi masalah dengan itu tidak akan mendeteksi jika panggilan template do_shortcode()
.
Jadi, saya cenderung menggunakan metode kedua dan kemudian mencoba mendeteksi apakah templat ditugaskan, dan jika demikian, parsing untuk kode pendek. Sebelum saya melakukan itu, saya ingin memeriksa apakah ada yang tahu metode yang lebih baik.
Pembaruan: Saya telah mengintegrasikan solusi ke dalam plugin saya. Jika ada yang ingin melihatnya diperbesar dalam lingkungan langsung, Anda dapat mengunduhnya atau menjelajahinya .
Pembaruan 2: Pada WordPress 3.3, sekarang mungkin untuk memanggil wp_enqueue_script()
langsung di dalam panggilan balik kode pendek , dan file JavaScript akan dipanggil di dalam footer dokumen. Itu secara teknis mungkin untuk file CSS juga, tetapi harus dianggap sebagai praktik buruk karena mengeluarkan CSS di luar <head>
tag melanggar spesifikasi W3C, dapat menggunakan FOUC, dan dapat memaksa browser untuk merender ulang halaman.
Jawaban:
Berdasarkan pengalaman saya sendiri, saya telah menggunakan kombinasi metode 1 & 2 - skrip arsitektur dan catatan kaki 1, dan teknik 'melihat ke depan' dari 2.
Untuk melihat-depan, saya menggunakan regex sebagai pengganti
stripos
; preferensi pribadi, lebih cepat, dan dapat memeriksa kode pendek 'salah bentuk';Jika Anda khawatir tentang penulis menggunakan
do_shortcode
secara manual, saya akan memilih untuk menginstruksikan mereka untukmenggunakan panggilan tindakanenqueue gaya pra-terdaftar Anda secara manual.UPDATE : Untuk penulis malas yang tidak pernah RTFM, mengeluarkan pesan untuk menyoroti kesalahan cara mereka;)
sumber
do_shortcode()
, apakah tidak masuk akal untuk menganggap bahwa mereka juga mahir dalam mengikuti instruksi untuk menentukan gaya kode pendek?init
, hanya di mana saja sebelumnyawp_head
. Untuk pengembang yang malas, periksawp_style_is( 'my_style_handle', 'done' )
di dalam kode pendek Anda. Jika itu salah, cetak kesalahan yang terlihat yang memerintahkan mereka apa yang harus dilakukan.do_shortcode()
ke templat sudah "melakukan sesuatu yang ekstra" - dan pengguna yang akan melakukan sesuatu itu ekstra akan sudah tahu tentang perlunya enqueue gaya, atau yang lain akan lebih bersedia / mungkin untuk mengikuti instruksi khusus.Saya terlambat menjawab pertanyaan ini, tetapi karena Ian memulai utas ini pada daftar wp-hacker hari ini membuat saya berpikir itu layak untuk dijawab terutama mengingat saya telah berencana untuk menambahkan fitur seperti itu ke beberapa plugin yang telah saya kerjakan.
Pendekatan yang perlu dipertimbangkan adalah memeriksa pada pemuatan halaman pertama untuk melihat apakah kode pendek benar-benar digunakan dan kemudian menyimpan status penggunaan kode pendek ke kunci meta pos. Begini caranya:
Langkah-demi-Langkah
$shortcode_used
bendera ke'no'
.$shortcode_used
bendera ke'yes'
.'the_content'
prioritas kait12
yang setelah WordPress memproses kode pendek dan periksa meta pos untuk''
menggunakan kunci"_has_{$shortcode_name}_shortcode"
. (Nilai''
dikembalikan ketika kunci meta pos tidak ada untuk ID pos.)'save_post'
pengait untuk menghapus meta pos yang menghapus bendera persisten untuk kiriman tersebut jika pengguna mengubah penggunaan kode pendek.'save_post'
hookwp_remote_request()
untuk mengirim GET HTTP non-blocking ke permalink posting sendiri untuk memicu memuat halaman pertama dan pengaturan flag persistent.'wp_print_styles'
dan periksa meta pos untuk nilai'yes'
,'no'
atau''
gunakan kunci"_has_{$shortcode_name}_shortcode"
. Jika nilainya'no'
tidak melayani eksternal. Jika nilainya'yes'
atau''
maju dan melayani eksternal.Dan itu harus dilakukan. Saya telah menulis dan menguji contoh plugin untuk menunjukkan bagaimana semua ini bekerja.
Contoh Kode Pengaya
Plugin bangun dengan
[trigger-css]
kode pendek yang mengatur<h2>
elemen - elemen pada halaman menjadi putih-merah sehingga Anda dapat melihatnya bekerja dengan mudah. Ini mengasumsikancss
subdirektori yang berisistyle.css
file dengan CSS ini di dalamnya:Dan di bawah ini adalah kode di plugin yang berfungsi:
Contoh Screenshot
Berikut serangkaian tangkapan layar
Editor Posting Dasar, Tidak Ada Konten
Tampilan Posting, Tidak Ada Konten
Editor Posting Dasar dengan
[trigger-css]
Kode PendekPosting Tampilan dengan
[trigger-css]
ShortcodeTidak yakin jika 100%
Saya percaya di atas harus bekerja di hampir semua kasus tetapi karena saya baru saja menulis kode ini saya tidak bisa 100% yakin. Jika Anda dapat menemukan situasi di mana itu tidak berhasil saya benar-benar ingin tahu sehingga saya dapat memperbaiki kode di beberapa plugin saya baru saja menambahkan ini. Terima kasih sebelumnya.
sumber
post_content
. Dan bagaimana dengan shortcode dalam widget?'pre_http_request'
kail dan menonaktifkan beberapa panggilan ke URL yang sama saat'save_post'
kail aktif, tetapi saya ingin menunggu sampai kita benar-benar melihat kebutuhan untuk itu, bukan? Adapun Widgets bisa ditingkatkan untuk menangani tapi itu bukan kasus penggunaan yang saya lihat.<style>
).Googling menemukan saya jawaban potensial . Saya mengatakan "potensi" karena terlihat bagus, harus bekerja, tetapi saya tidak 100% yakin itu cara terbaik untuk melakukannya:
Ini harus dapat memeriksa apakah posting saat ini menggunakan kode pendek dan menambahkan stylesheet ke
<head>
elemen dengan tepat. Tapi saya tidak berpikir itu akan berfungsi untuk halaman indeks (yaitu beberapa posting di loop) ... Ini juga dari posting blog lama 2-tahun, jadi saya bahkan tidak yakin itu akan bekerja dengan WP 3.1.X .sumber
get_shortcode_regex()
untuk mencari.do_shortcode()
secara manual dalam templat maka Anda sudah tahu Anda akan menjalankan kode pendekDengan menggunakan kombinasi jawaban TheDeadMedic dan dokumentasi get_shortcode_regex () (yang sebenarnya tidak menemukan kode pendek saya), saya membuat fungsi sederhana yang digunakan untuk membuat skrip enqueue untuk beberapa kode pendek. Karena wp_enqueue_script () dalam shortcode hanya menambah footer, ini dapat membantu karena dapat menangani skrip header dan footer.
sumber
Akhirnya saya juga menemukan solusi untuk pemuatan css bersyarat yang berfungsi untuk plugin saya www.mapsmarker.com dan saya ingin berbagi dengan Anda. Ia memeriksa apakah kode pendek saya digunakan dalam file templat saat ini dan header / footer.php dan jika ya, enqueues stylesheet yang diperlukan di header:
sumber
Untuk plugin saya, saya menemukan bahwa kadang-kadang pengguna memiliki pembuat tema yang memiliki kode pendek yang disimpan dalam data meta pos . Inilah yang saya gunakan untuk mendeteksi apakah kode pendek plugin saya ada di pos saat ini atau data meta pos :
sumber
Untuk file CSS Anda dapat memuatnya dalam output kode pendek Anda:
Tetapkan konstanta atau sesuatu setelah ini, seperti
MY_CSS_LOADED
(hanya sertakan CSS jika konstanta tidak disetel).Kedua metode Anda lebih lambat daripada berjalan dengan cara ini.
Untuk file JS Anda dapat melakukan hal yang sama jika skrip yang Anda muat unik dan tidak memiliki dependensi luar. Jika ini bukan case memuatnya di dalam footer, tetapi gunakan konstanta untuk menentukan apakah perlu dimuat atau tidak ...
sumber
<head>
elemen bukan markup yang tepat. Benar, validasi hanyalah sebuah panduan, tetapi jika kita mencoba untuk tetap berpegang pada pedoman itu, membuat memuat stylesheet dalam output shortcode adalah ide yang buruk.<style type="text/css"> The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head"
. Jadi gaya inline (<element style="..."></element>
) valid, tetapi<style>
elemen inline tidak.Script Logic adalah plugin WordPress yang memberi Anda kendali penuh atas semua file JavaScript dan CSS. Dengan menggunakan plugin ini, Anda dapat memuat file CSS dan JS secara kondisional hanya pada halaman yang diperlukan.
http://wordpress.org/plugins/script-logic/
sumber