Saya memiliki variabel di header.php, seperti:
$page_extra_title = get_post_meta($this_page->ID, "_theme_extra_title", true);
Setelah saya lakukan:
var_dump($page_extra_title);
Saya selalu NULL
keluar dari header.php (var_dump hanya berfungsi dengan baik di header.php). Saya telah menempelkan variabel yang sama di mana pun saya membutuhkannya (page.php, post.php, footer.php, dll.), Tapi ini gila dan membuat semuanya hampir mustahil untuk dipertahankan.
Saya bertanya-tanya apa cara terbaik untuk melewatkan variabel melalui semua file di tema saya? Saya kira menggunakan functions.php bersama dengan "get_post_meta" mungkin bukan ide terbaik? :)
global
kan? Tapi itu tidak mungkin untuk alasan yang baik. Selain itu Anda harus "memanggil"global
-variables juga, dengan menggunakan kata kunci untuk membuatnya tersedia. Tergantung pada sesi penggunaan kasus mungkin menjadi solusi. Kalau tidak - seperti yang disebutkan - saya pikir fungsi atau kelas untuk melakukan pekerjaan untuk Anda adalah cara untuk pergi.Jawaban:
Struktur data terpisah dasar
Untuk meneruskan data, Anda biasanya menggunakan Model (itulah "M" dalam "MVC"). Mari kita lihat antarmuka data yang sangat sederhana. Antarmuka hanya digunakan sebagai "Resep" untuk blok bangunan kami:
Di atas adalah apa yang kami sebarkan: ID umum dan "Label".
Menampilkan data dengan menggabungkan potongan atom
Selanjutnya kita memerlukan beberapa Tampilan yang bernegosiasi antara Model kita dan ... template kita.
Pada dasarnya itu kata Antarmuka
Akhirnya kita perlu menerapkan di atas dan membangun View yang sebenarnya . Seperti yang Anda lihat, konstruktor memberi tahu bahwa hal wajib untuk tampilan kami adalah Templat dan kami dapat membuatnya. Demi pengembangan mudah, kami bahkan memeriksa apakah file template benar-benar ada sehingga kami dapat membuat pengembang lain hidup (dan juga kami) jauh lebih mudah dan perhatikan itu.
Pada langkah kedua dalam fungsi render kami menggunakan Penutupan untuk membangun pembungkus template aktual dan
bindTo()
Model untuk templat.Memisahkan View dan Rendering
Ini artinya kita bisa menggunakan templat yang sangat sederhana seperti berikut ini
untuk membuat konten kami. Menyatukan potongan-potongan kita akan mendapatkan sesuatu di sekitar baris berikut (di Controller, Mediator, dll):
Apa yang kita dapatkan?
Dengan cara ini kita bisa
Menggabungkan OOP PHP dengan WP API
Tentu saja hal ini hampir tidak mungkin dengan menggunakan fungsi theming dasar seperti
get_header()
,get_footer()
, dll, kan? Salah. Panggil saja kelas Anda di bagian templat apa pun yang Anda inginkan. Render, ubah data, lakukan apa pun yang Anda inginkan. Jika Anda benar-benar baik, Anda bahkan hanya menambahkan banyak filter kustom Anda sendiri dan memiliki beberapa negosiator untuk mengurus apa yang akan diberikan oleh pengontrol mana pada rute / beban template bersyarat mana.Kesimpulan?
Anda dapat bekerja dengan hal-hal seperti di atas di WP tanpa masalah dan masih tetap menggunakan API dasar dan menggunakan kembali kode dan data tanpa memanggil satu pun global atau mengacaukan dan mencemari ruang nama global.
sumber
Ini adalah pendekatan alternatif untuk @kaiser jawaban , yang saya temukan cukup baik (+1 dari saya) tetapi membutuhkan pekerjaan tambahan untuk digunakan dengan fungsi-fungsi WP inti dan itu per-se terintegrasi rendah dengan hierarki templat.
Pendekatan yang ingin saya bagikan didasarkan pada satu kelas (ini adalah versi singkat dari sesuatu yang saya kerjakan) yang menangani render data untuk templat.
Ini memiliki beberapa (IMO) fitur menarik:
$this
kata kunci: ini memberi Anda kemungkinan untuk menghindari pemberitahuan dalam produksi jika ada variabel yang tidak ditentukanThe
Engine
Kelas(Tersedia sebagai Intisari di sini.)
Cara Penggunaan
Satu-satunya hal yang diperlukan adalah memanggil
Engine::init()
metode, mungkin dengan cara apa pun'template_redirect'
. Itu bisa dilakukan dalam temafunctions.php
atau dari sebuah plugin.Itu saja.
Template Anda yang ada akan berfungsi seperti yang diharapkan. Tetapi sekarang Anda memiliki kemungkinan untuk mengakses data templat khusus.
Data Template Kustom
Untuk meneruskan data khusus ke template ada dua filter:
'gm_template_data'
'gm_template_data_{$type}'
Yang pertama dipecat untuk semua templat, yang kedua adalah templat khusus, pada kenyataannya, bagian dymamic
{$type}
adalah nama dasar dari file templat tanpa ekstensi file.Misalnya filter
'gm_template_data_single'
dapat digunakan untuk meneruskan data kesingle.php
templat.Callback terlampir pada kait ini ini harus mengembalikan array , di mana kunci adalah nama variabel.
Misalnya, Anda dapat meneruskan data meta sebagai data templat suka seperti itu:
Dan kemudian, di dalam templat Anda cukup menggunakan:
Mode Debug
Ketika kedua konstanta
WP_DEBUG
danWP_DEBUG_DISPLAY
itu benar, kelas bekerja dalam mode debug. Ini berarti bahwa jika suatu variabel tidak didefinisikan pengecualian dilemparkan.Ketika kelas tidak dalam mode debug (mungkin dalam produksi) mengakses variabel yang tidak terdefinisi akan menghasilkan string kosong.
Model Data
Cara yang bagus dan dapat dikelola untuk mengatur data Anda adalah dengan menggunakan kelas model.
Mereka bisa menjadi kelas yang sangat sederhana, yang mengembalikan data menggunakan filter yang sama yang dijelaskan di atas. Tidak ada antarmuka khusus untuk diikuti, mereka dapat diatur sesuai keinginan Anda.
Di bawah ini, hanya ada sebuah contoh, tetapi Anda bebas melakukannya dengan cara Anda sendiri.
The
__invoke()
metode (yang berjalan ketika kelas digunakan seperti callback) mengembalikan string yang akan digunakan untuk<title>
tag template.Berkat fakta bahwa argumen kedua yang dilewati
'gm_template_data'
adalah nama templat, metode ini mengembalikan judul khusus untuk beranda.Memiliki kode di atas, maka dimungkinkan untuk menggunakan sesuatu seperti
di
<head>
bagian halaman.Sebagian
WordPress memiliki fungsi seperti
get_header()
atauget_template_part()
yang dapat digunakan untuk memuat sebagian ke templat utama.Fungsi-fungsi ini, seperti semua fungsi WordPress lainnya, dapat digunakan dalam template ketika menggunakan
Engine
kelas.Satu-satunya masalah adalah bahwa di dalam parsial dimuat menggunakan fungsi inti WordPress tidak mungkin untuk menggunakan fitur canggih untuk mendapatkan data templat kustom menggunakan
$this
.Untuk alasan ini,
Engine
kelas memiliki metodepartial()
yang memungkinkan untuk memuat sebagian (dengan cara yang sepenuhnya kompatibel dengan tema anak) dan masih dapat digunakan secara parsial data templat kustom.Penggunaannya cukup sederhana.
Dengan asumsi ada file bernama folder
partials/content.php
theme (atau child theme), itu dapat dimasukkan menggunakan:Di dalam parsial itu akan mungkin untuk mengakses semua data tema induk dengan cara yang sama.
Tidak seperti fungsi WordPress,
Engine::partial()
metode memungkinkan untuk mengirimkan data tertentu ke parsial, hanya meneruskan array data sebagai argumen kedua.Secara default, sebagian memiliki akses ke data yang tersedia dalam tema induk dan ke data yang dilewatkan secara eksplisit.
Jika beberapa variabel yang secara eksplisit diteruskan ke parsial memiliki nama yang sama dengan variabel tema induk, maka variabel yang diteruskan secara eksplisit menang.
Namun, juga dimungkinkan untuk memasukkan parsial dalam mode terisolasi , yaitu parsial tidak memiliki akses ke data tema induk. Untuk melakukan itu, sampaikan
true
argumen ketiga kepartial()
:Kesimpulan
Sekalipun cukup sederhana,
Engine
kelasnya cukup lengkap, tetapi tentunya bisa lebih ditingkatkan. Misalnya tidak ada cara untuk memeriksa apakah suatu variabel didefinisikan atau tidak.Berkat kompatibilitasnya 100% dengan fitur WordPress dan hierarki templat Anda dapat mengintegrasikannya dengan kode pihak ketiga yang ada dan tidak ada masalah.
Namun, perhatikan bahwa hanya sebagian yang diuji, jadi ada kemungkinan ada masalah yang belum saya temukan.
Lima poin di bawah "Apa yang kita dapatkan?" dalam jawaban @iser :
semua berlaku untuk kelas saya juga.
sumber
Jawaban sederhana, jangan lewat variabel di mana pun karena bau menggunakan variabel global yang jahat.
Dari contoh Anda, sepertinya Anda mencoba melakukan pengoptimalan awal, namun kejahatan lain;)
Gunakan wordpress API untuk mendapatkan data yang disimpan dalam DB dan jangan mencoba mengakali dan mengoptimalkan penggunaannya karena API melakukan lebih dari sekadar mengambil nilai dan mengaktifkan filter dan tindakan. Dengan menghapus panggilan API, Anda menghapus kemampuan pengembang lain untuk mengubah perilaku kode Anda tanpa memodifikasinya.
sumber
Meskipun jawaban kaiser secara teknis benar, saya ragu itu adalah jawaban terbaik untuk Anda.
Jika Anda membuat tema Anda sendiri, maka saya pikir itu memang cara terbaik untuk membuat semacam kerangka menggunakan kelas (dan mungkin ruang nama dan antarmuka juga, meskipun itu mungkin sedikit terlalu banyak untuk tema WP).
Di sisi lain, jika Anda hanya memperluas / menyesuaikan tema yang ada dan hanya perlu melewati satu atau beberapa variabel, saya pikir Anda harus tetap dengan
global
. Karenaheader.php
termasuk dalam suatu fungsi, variabel yang Anda nyatakan dalam file itu hanya dapat digunakan dalam file itu. Denganglobal
Anda membuatnya dapat diakses di seluruh proyek WP:Dalam
header.php
:Dalam
single.php
(misalnya):sumber
$wp_theme_vars_page_extra_title
atau$wp_theme_vars['page_extra_title']
misalnya. Itu hanya penjelasan mengapa global akan bekerja di sini. OP bertanya cara melewati variabel melalui semua file, menggunakanglobal
adalah cara untuk melakukan itu.but it is really bad practice diving into the global scope
Saya berharap seseorang mengatakan itu kepada pengembang inti WP. Saya benar-benar tidak mengerti titik menggunakan ruang nama, abstraksi data, pola desain, pengujian unit, dan praktik / teknik pemrograman terbaik lainnya dalam kode yang ditulis untuk Wordpress ketika inti Wordpress dipenuhi dengan praktik pengkodean yang buruk seperti variabel glabal (misalnya, widget kode).Solusi mudah adalah menulis fungsi untuk mendapatkan judul tambahan. Saya menggunakan variabel statis untuk menjaga panggilan basis data menjadi satu saja. Letakkan ini di functions.php Anda.
Di luar header.php, panggil fungsi untuk mendapatkan nilai:
sumber