Lingkup variabel Tema WordPress

9

Saya perlu membuat variabel yang dapat diakses di seluruh file templat Tema WordPress saya (index.php, header.php dll.). Saya tahu definisi fungsi masuk ke dalam functions.phpfile template (di jalur tema Anda), tetapi tidak ada variabel variabel.

Misalnya saya terus-menerus perlu mengambil Kategori di Tema saya, jadi saya ingin ini dapat diakses dari mana saja di tema saya:

$categories = get_categories(); /* get_categories() is a wordpress function */ 

Dengan cara ini saya dapat dengan mudah mengakses data yang dialokasikan, tanpa harus mengalokasikan ulang setiap kali saya perlu mendapatkan kategori saya.

Sayangnya menambahkan potongan kode dalam functions.phpfile saya , tidak berfungsi, juga tidak membuat variabel global.

Gonçalo Peres 龚燿禄
sumber

Jawaban:

5

Rupanya berhasil global. Masalahnya adalah bahwa variabel saya $categoriesharus didefinisikan ulang dengan globaldi depannya, di setiap templat yang saya perlukan untuk menggunakannya.


sumber
2
Apakah ada orang lain yang tahu solusi yang lebih intuitif daripada harus mendefinisikannya kembali sebagai global dalam setiap file templat? Saya menggunakan metode ini dalam mengembangkan tema saya dan sepertinya ... tidak pada tempatnya.
1
Bung yang luar biasa, terima kasih! Bagi siapa pun yang siap dengan ini yang agak tebal seperti saya: Di file functions.php Anda: <? Php $ test = "I'm a test!"; ?> Di Anda, saya tidak tahu, header.php: <? Php $ global test; echo $ test; ?> dan kamu emas!
Dominic
Jika ini membantu untuk memperjelas: semua file template WordPress disebut oleh require()pernyataan yang dibungkus dalam fungsi: get_header(), get_footer(), dll; yang mereka sendiri adalah pembungkus di sekitar fungsi get_template_part(). Karena fungsi dalam PHP hanya memiliki akses ke variabel yang ditentukan di dalamnya atau diteruskan dengan referensi kepadanya, jika Anda ingin menggunakan variabel dari lingkup global (atau mendefinisikan variabel dan membuatnya dapat diakses dalam lingkup global) Anda harus mengumumkannya dengan kata kunci global terlebih dahulu.
Goldenapple
1

Dominic (tidak tahu bagaimana cara menambahkan catatan pada jawabannya):

define hanya menerima skalar, jadi Anda tidak bisa melakukannya define( CATS, get_categories() ); dan bahkan tidak

$categories = get_categories();
define( CATS, $categories );

Kalau tidak, definisikan berfungsi dengan baik, dan itu sebenarnya lebih aman untuk skalar (karena Anda dapat memastikan konstanta tidak dapat ditimpa)


sumber
1

Saya tahu ini benar-benar tua, tetapi ada ruang untuk perbaikan.

Anda harus mempertimbangkan menggunakan $ GLOBAL ['kategori'] bukan hanya global.

Ada dua alasan untuk ini:

  1. Kami tidak harus menulis global $categories;setiap saat.
  2. Sangat jelas maka kita menggunakan global dan kemudian tidak.

Pertimbangkan kode ini:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

Hanya jika kita menginisialisasi keadaan global tepat sebelum menggunakan variabel, cukup sulit untuk mengatakannya, apakah itu global atau tidak. Dan jangan lupa untuk mengulanginya di semua file template yang Anda miliki.

Dimungkinkan untuk menggunakan konvensi penamaan untuk itu, tetapi menurut saya ada cara yang lebih baik.

Pertimbangkan untuk menggunakan $GLOBALS['categories'].

Kita hanya perlu menginisialisasi variabel kita satu kali di functions.php tanpa harus memikirkan global $categorieslagi. Dan kita bisa melihat itu global.

print_r ($GLOBALS['categories']);

Masalah kinerja bukanlah masalah sama sekali dalam situasi ini. Saya akan mengutip Sara Golemon ( tautan ):

Apa artinya itu untuk penggunaan array $ GLOBALS Anda? Benar, kata kunci global secara teknis lebih cepat. Sekarang, saya ingin sangat jelas tentang satu hal di sini. Harga beli minor yang diberikan dengan menggunakan global Anda sebagai [variabel terkompilasi] yang terlokalisasi perlu ditimbang secara serius terhadap kelayakan untuk melihat kode Anda dalam lima tahun dan mengetahui bahwa $ foo berasal dari lingkup global. something_using ($ GLOBALS ['foo']); akan SELALU lebih jelas bagi Anda di telepon daripada global $ foo; / * kode buncha * / something_using ($ foo); Jangan bijak dan penumbuk bodoh ..

Keeprock
sumber
0

Ini juga berfungsi:

di functions.php tambahkan define('TEST', 'this is a test');
dan di header.php Anda atau apa punecho TEST;

Apakah ada keunggulan kinerja untuk satu metode di atas yang lain?

Dominic
sumber