WordPress Tema değişkenleri kapsamı


9

Benim WordPress Tema şablon dosyaları (index.php, header.php vb ..) erişilebilir bir değişken oluşturmak gerekir. İşlev tanımlarının functions.phpşablon dosyasının (tema yolunuzda) içine girdiğini biliyorum , ancak değişkenler için böyle bir şey yok.

Örneğin, Temamdaki Kategorileri sürekli olarak almam gerekiyor, bu yüzden temamın herhangi bir yerinden erişilebilir olmasını istiyorum:

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

Bu şekilde, kategorilerimi her almam gerektiğinde yeniden tahsis etmek zorunda kalmadan, ayrılan verilere erişebilirim.

Maalesef bu kod parçasını dosyama eklemek functions.phpişe yaramıyor, değişkeni de oluşturmuyor global.

Yanıtlar:


5

Görünüşe göre globalhile yapar. Sorun benim değişken olmasıydı $categoriesolması gereken yeniden bir ile globalonu kullanmak için gerekli her şablonda, onun önünde.


2
Herkes her şablon dosyasında global olarak yeniden tanımlamaktan daha sezgisel bir çözüm biliyor mu? Temamı geliştirmek için bu yöntemi kullanıyorum ve görünüşe göre ... yerinde değil.

1
Harika dostum, teşekkürler! Benim için biraz kalın olan ve hazır olan herkes için: function.php dosyanızda: <? Php $ test = "Ben bir testim!"; ?> Senin bilmiyorum, header.php: <? Php global $ test; echo $ testi; ?> ve sen altınsın!
Dominic

WordPress şablon dosyaların tümü tarafından denir: Bu netleştirmek için yardımcı olursa require()işlevlerde sarılır ifadeleri: get_header(), get_footer()vb; kendileri de işlevin etrafındaki sarmalayıcılardır get_template_part(). PHP'deki işlevler yalnızca kendi içinde tanımlanan veya bunlara referansla geçirilen değişkenlere erişebildiğinden, global kapsamdan bir değişken kullanmak (veya bir değişkeni tanımlamak ve genel kapsamda erişilebilir hale getirmek) istiyorsanız bunu duyurmanız gerekir önce global anahtar kelimeyle
goldenapples

1

Dominic (Cevabına nasıl not ekleyeceğimi bilmiyorum):

tanımlamak sadece skaler kabul eder, bu yüzden yapamadınız define( CATS, get_categories() ); ve hatta

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

Aksi takdirde iyi çalışır tanımlayın ve aslında skaler için daha güvenlidir (sabitlerin üzerine yazılamayacağından emin olabilirsiniz)


1

Bu gerçekten eski olduğunu biliyorum, ama iyileştirilmesi için bir oda var.

Sadece global yerine $ GLOBALS ['category'] kullanmayı düşünmelisiniz.

Bunun iki nedeni var:

  1. Her zaman yazmak zorunda değiliz global $categories;.
  2. Kristal berraklığında o zaman küresel kullanıyoruz, sonra kullanmıyoruz.

Bu kodu düşünün:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

Değişkeni kullanmadan hemen önce küresel durumu başlatırsak, küresel olup olmadığını söylemek oldukça zordur. Ve sahip olduğunuz şablon dosyalarından herhangi birinde tekrarlamayı unutmayın.

Bunun için adlandırma kurallarını kullanmak mümkündür, ancak bence daha iyi bir yol var.

Kullanmayı düşünün $GLOBALS['categories'].

Değişkenimizi bir kez daha düşünmek zorunda kalmadan function.php dosyasında yalnızca bir kez başlatmamız gerekir global $categories. Ve küresel olduğunu görebiliyoruz.

print_r ($GLOBALS['categories']);

Performans sorunu bu durumda hiç bir sorun değildir. Sara Golemon'dan alıntı yapacağım ( link ):

$ GLOBALS dizisini kullanmanız ne anlama geliyor? Doğru, global anahtar kelime teknik olarak daha hızlı. Şimdi, burada bir şey hakkında gerçekten net olmak istiyorum. Küresel değerlerinizi yerelleştirilmiş [derlenmiş değişkenler] olarak kullanarak verilen küçük hız ekonomikliği, beş yıl içinde kodunuza bakmanın ve $ foo'nun küresel kapsamdan geldiğinin bilinmesine karşı ciddi şekilde tartılmalıdır. something_using ($ GLOBALS [ 'foo']); HER ZAMAN size küresel $ foo'dan daha net olacak; / * buncha kodu * / bir şey_kullanma ($ foo); Kuruş ve pound aptal olmayın ..


0

Bu ayrıca işe yarar:

function.php define('TEST', 'this is a test');
dosyasında ve header.php dosyasında ya da her neyseecho TEST;

Bir yöntemin diğerine göre performans avantajı var mı?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.