ขอบเขตตัวแปร WordPress Theme


9

ฉันต้องสร้างตัวแปรที่สามารถเข้าถึงได้ตลอดทั้งไฟล์เทมเพลต WordPress Theme (index.php, header.php ฯลฯ .. ) ฉันรู้ว่าคำจำกัดความของฟังก์ชั่นนั้นอยู่ในfunctions.phpไฟล์เทมเพลต (ในพา ธ ธีมของคุณ) แต่ไม่มีตัวแปรสำหรับสิ่งนั้น

ตัวอย่างเช่นฉันต้องดึงหมวดหมู่ในธีมของฉันอย่างต่อเนื่องดังนั้นฉันจึงต้องการให้เข้าถึงได้จากทุกที่ในธีมของฉัน:

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

วิธีนี้ฉันสามารถเข้าถึงข้อมูลที่จัดสรรได้โดยไม่ต้องจัดสรรใหม่ทุกครั้งที่ต้องการหมวดหมู่ของฉัน

แต่น่าเสียดายที่การเพิ่มชิ้นส่วนของรหัสในของฉันที่ไฟล์ไม่ทำงานไม่ไม่ทำให้ตัวแปรfunctions.phpglobal

คำตอบ:


5

เห็นได้ชัดว่าglobalจะหลอกลวง ปัญหาคือตัวแปรของฉัน$categoriesควรได้รับการนิยามใหม่ด้วยการglobalอยู่ข้างหน้ามันในแต่ละเทมเพลตที่ฉันต้องการใช้


2
ไม่มีใครรู้วิธีแก้ปัญหาที่ใช้งานง่ายกว่าที่จะต้องกำหนดเป็นโลกในทุกไฟล์แม่แบบ? ฉันใช้วิธีนี้ในการพัฒนาชุดรูปแบบของฉันและมันดูเหมือน ... นอกสถานที่

1
เพื่อนที่น่ากลัวขอบคุณ! สำหรับทุกคนที่พร้อมสิ่งนี้ที่หนาเหมือนฉัน: ในไฟล์ functions.php ของคุณ: <? php $ test = "ฉันเป็นคนทดสอบ!"; ?> ในของคุณฉันไม่รู้ header.php: <? php global $ test; echo $ test; ?> และคุณเป็นทอง!
Dominic

ถ้าเรื่องนี้จะช่วยให้การชี้แจง: ทั้งหมดของไฟล์แม่แบบใน WordPress จะเรียกได้ว่าเป็นrequire()งบที่มีการห่อในฟังก์ชั่น: get_header(), get_footer()ฯลฯ ; ซึ่งตัวเองเป็นห่อรอบ ๆ get_template_part()ฟังก์ชั่น เนื่องจากฟังก์ชั่นใน PHP มีการเข้าถึงตัวแปรที่กำหนดไว้ภายในหรือผ่านการอ้างอิงไปยังพวกมันเท่านั้นหากคุณต้องการใช้ตัวแปรจากขอบเขตทั่วโลก (หรือกำหนดตัวแปรและทำให้สามารถเข้าถึงได้ในขอบเขตทั่วโลก) คุณต้องประกาศ ด้วยคำหลักทั่วโลกก่อน
goldenapples

1

โดมินิค (ไม่รู้วิธีเพิ่มบันทึกย่อในคำตอบของเขา):

define เท่านั้นรับ scalars ดังนั้นคุณไม่สามารถทำได้ define( CATS, get_categories() ); และไม่ได้

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

มิฉะนั้นกำหนดใช้งานได้ดีและในความเป็นจริงปลอดภัยสำหรับ scalars (ในขณะที่คุณสามารถมั่นใจได้ว่าค่าคงที่ไม่สามารถเขียนทับ)


1

ฉันรู้ว่าอันนี้เก่าจริง ๆ แต่มีห้องพักสำหรับการปรับปรุง

คุณควรพิจารณาใช้ $ GLOBALS ['หมวดหมู่'] แทนที่จะเป็นเพียงทั่วโลก

มีสองเหตุผลสำหรับสิ่งนี้:

  1. เราไม่ต้องเขียนglobal $categories;ทุกครั้ง
  2. มันชัดเจนแล้วเรากำลังใช้ทั่วโลกและไม่

พิจารณารหัสนี้:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

เฉพาะในกรณีที่เราเริ่มต้นสถานะโลกก่อนที่จะใช้ตัวแปรมันเป็นเรื่องยากที่จะบอกว่ามันเป็นโลกหรือไม่ และอย่าลืมทำซ้ำในไฟล์เทมเพลตที่คุณมี

เป็นไปได้ที่จะใช้การตั้งชื่อแบบแผนสำหรับสิ่งนั้น แต่มีวิธีที่ดีกว่าในความคิดของฉัน

$GLOBALS['categories']พิจารณาใช้

เราต้องเริ่มต้นตัวแปรของเราเพียงครั้งเดียวใน function.php โดยไม่ต้องคิดglobal $categoriesอีกครั้ง และเราสามารถเห็นได้ว่ามันเป็นระดับโลก

print_r ($GLOBALS['categories']);

ปัญหาประสิทธิภาพการทำงานไม่ใช่ปัญหาเลยในสถานการณ์นี้ ฉันจะพูด Sara Golemon ( ลิงก์ ):

สิ่งนี้มีความหมายอย่างไรต่อการใช้งานอาร์เรย์ $ GLOBALS ของคุณ ถูกต้องแล้วคำหลักสากลนั้นเร็วกว่าทางเทคนิค ตอนนี้ฉันต้องการที่จะชัดเจนเกี่ยวกับสิ่งหนึ่งที่นี่ ความเร็วในการจ่ายเล็กน้อยที่กำหนดโดยใช้ globals ของคุณเป็น [ตัวแปรรวบรวม] ที่แปลเป็นภาษาท้องถิ่นจะต้องมีการชั่งน้ำหนักอย่างจริงจังต่อความสามารถในการบำรุงรักษาของการดูรหัสของคุณในห้าปีและรู้ว่า $ foo มาจากขอบเขตทั่วโลก something_using ($ GLOBALS [ 'foo']); จะทำให้คุณชัดเจนยิ่งกว่าบรรทัดที่ $ foo ทั่วโลก; / * รหัส buncha * / something_using ($ foo); อย่าเป็นคนฉลาดและต้องโง่เขลา ..


0

สิ่งนี้ยังใช้งานได้:

ใน functions.php เพิ่มdefine('TEST', 'this is a test');
และใน header.php ของคุณหรืออะไรก็ตามecho TEST;

มีความได้เปรียบ perfomance วิธีหนึ่งมากกว่าอีกวิธีหนึ่งหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.