UPDATE: Pertanyaan asli saya telah dipecahkan, tetapi ini berubah menjadi diskusi yang valid tentang mengapa tidak menggunakan variabel global, jadi saya memperbarui pertanyaan untuk mencerminkan itu. Solusinya adalah <?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
seperti yang disarankan @TomJNowell.
UPDATE 2: Saya sekarang melakukan apa yang saya inginkan. Tapi saya masih menggunakan lingkup global dan akan senang menemukan cara yang lebih baik.
Saya mencoba mengatur sejumlah variabel global untuk permalink ke kategori yang akan digunakan di berbagai tempat dalam tema saya. Alasan utama untuk ini adalah untuk digunakan di kedua navigasi utama, serta dalam serangkaian sub navigasi yang dipilih berdasarkan pada kategori apa posting saat ini masuk. Ini bukan tema saya akan merilis untuk digunakan oleh orang lain, tetapi dibangun untuk satu tujuan yang sangat spesifik.
Inilah cara saya membuat mereka saat ini (saya hanya menempelkan beberapa variabel).
function set_global_nav_var()
{
//proposal
global $prop;
// Get the ID of a given category
$category_id_prop = get_cat_ID( 'proposal' );
// Get the URL of this category
$category_link_prop = get_category_link( $category_id_prop );
$prop = '<a href="' .esc_url( $category_link_prop ). '" title="Proposal">Proposal</a>';
//Calvinball
global $cb;
// Get the ID of a given category
$category_id_cb = get_cat_ID( 'calvinball' );
// Get the URL of this category
$category_link_cb = get_category_link( $category_id_cb );
$cb = '<a href="' .esc_url( $category_link_cb). '" title="Calvinball">Calvinball</a>';
}
add_action( 'init', 'set_global_nav_var' );
Sekarang saya bisa melakukan <?php global $prop; echo $prop; ?>
4 tempat yang masuk dan mendapatkan kembali seluruh tautan untuk kode. Ketika itu berubah, saya hanya perlu mengubahnya di satu tempat. Saya terbuka untuk alternatif yang tidak melibatkan lingkup global.
Jawaban:
Meskipun saya sangat menyarankan ini, dan itu tidak akan mempercepat, penggunaan Anda tidak benar.
Ketika Anda mencoba menggunakan global Anda harus menentukan kata kunci global terlebih dahulu. Anda telah menentukannya di sini saat menentukan nilainya, tetapi di luar cakupan itu perlu didefinisikan ulang sebagai variabel cakupan global.
misalnya di functions.php:
Di single.php, ini tidak akan berfungsi:
Karena $ hello tidak terdefinisi. Namun ini akan berhasil:
Tentu saja Anda tidak harus melakukan keduanya. WordPress sudah mencoba untuk men-cache hal-hal ini di cache objek. Anda tidak akan melihat peningkatan kecepatan dari melakukan ini (Anda mungkin melihat penurunan kecepatan kecil), semua Anda akan dapatkan kompleksitas tambahan dan kebutuhan untuk mengetikkan banyak deklarasi global yang tidak perlu.
Anda akan lebih baik menggunakan data terstruktur, seperti objek atau injeksi ketergantungan, atau dalam kasus Anda, satu set fungsi.
Sebagai contoh, berikut ini adalah cara melakukan sesuatu yang serupa melalui variabel statis (masih buruk karena alasan yang sama, tetapi hanya sedikit lebih sedikit, dan lebih mudah untuk mengetik) misalnya
Jika Anda benar-benar ingin menghemat waktu dengan menyimpan data di suatu tempat untuk digunakan kembali, pertimbangkan untuk menggunakan
WP_Cache
sistem denganwp_cache_get
dllsumber
<?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
sesuai saran Anda. Terima kasih!Jangan gunakan variabel global , sesederhana itu.
Mengapa tidak menggunakan global
Karena penggunaan global mempersulit pemeliharaan perangkat lunak dalam jangka panjang.
Inti WordPress memiliki banyak cara untuk banyak menggunakan global. Saat mencoba memahami bagaimana fungsi dasar seperti
the_content
bekerja, Anda tiba-tiba menyadari bahwa$more
variabelnya bukan lokal tetapi global dan perlu mencari seluruh file inti untuk memahami kapan itu disetel ke true.Jadi, apa yang dapat dilakukan ketika mencoba menghentikan penyalinan & menempel beberapa baris kode alih-alih menyimpan hasil run pertama di global? Ada beberapa pendekatan, fungsional dan OOP.
Fungsi pemanis. Ini hanyalah pembungkus / makro untuk menyimpan copy / paste
Keuntungannya adalah sekarang ada dokumentasi untuk apa yang dilakukan oleh global sebelumnya, dan Anda memiliki titik jelas untuk debugging ketika nilai yang dikembalikan bukan yang Anda harapkan.
Setelah Anda memiliki pemanis, mudah untuk men-cache hasil jika diperlukan (lakukan hanya jika Anda menemukan bahwa fungsi ini membutuhkan waktu lama untuk dijalankan)
Ini memberi Anda perilaku global yang sama tetapi dengan keuntungan memiliki inisialisasi yang terjamin setiap kali Anda mengaksesnya.
Anda dapat memiliki pola yang mirip dengan OOP. Saya menemukan bahwa OOP biasanya tidak menambah nilai dalam plugin dan tema, tetapi ini adalah diskusi yang berbeda
Ini adalah kode clumsier, tetapi jika Anda memiliki beberapa nilai yang ingin Anda lakukan karena selalu digunakan, ini bisa menjadi cara untuk melakukannya. Pada dasarnya ini adalah objek yang berisi semua global Anda secara terorganisir. Untuk menghindari membuat instance objek ini menjadi global (Anda ingin satu instance jika tidak, Anda menghitung ulang nilai-nilai) Anda mungkin ingin menggunakan pola tunggal (beberapa orang berpendapat itu adalah ide yang buruk, YMMV)
Saya tidak suka mengakses atribut objek secara langsung, jadi dalam kode saya itu akan warpe lagi
sumber
Pertanyaan Anda terkait dengan cara kerja php.
Ambil $ wpdb sebagai contoh
$ wpdb adalah variabel global yang terkenal.
Apakah Anda tahu kapan itu akan dinyatakan dan ditugaskan dengan nilai-nilai?
Setiap halaman dimuat , ya, setiap kali Anda mengunjungi situs wordpress Anda.
Demikian pula, Anda perlu memastikan variabel-variabel yang ingin diglobalisasi akan dideklarasikan dan ditugaskan dengan nilai yang sesuai setiap halaman yang dimuat.
Meskipun saya bukan seorang desainer tema, saya dapat mengatakan bahwa after_setup_theme adalah pengait waktu. itu hanya akan dipicu ketika tema diaktifkan.
Jika saya jadi Anda, saya akan menggunakan init atau kait lainnya. Tidak, jika saya jadi Anda, saya tidak akan menggunakan variabel global sama sekali ...
Saya benar-benar tidak pandai menjelaskan banyak hal. Jadi, Anda harus mengambil buku jika ingin mempelajari PHP.
sumber
Anda selalu dapat menggunakan pola tunggal melalui getter statis.
sumber