วิธีใช้ get_template_part ()


25

มีใครช่วยอธิบายให้ฉันฟังก์ชั่นนี้ได้ไหม? ฉันรู้ว่ามันทำอะไร แต่เมื่อฉันดูซอร์สโค้ดในเทมเพลต twenty_ten ฉันไม่ทราบว่าจะรวบรวมลูปทั้งหมดใน loop.php เดียว (ฉันเห็นไฟล์นั้น)

ดังนั้นตัวอย่างเช่นนามธรรมแยกส่วนทั่วไปของเทมเพลตแล้วนำมาใช้ซ้ำในแม่แบบอื่น ๆ ได้อย่างไร


คำตอบ:


25

คำตอบเบื้องต้นที่ดีมากที่นี่

โดยทั่วไปget_template_part()จะช่วยให้นักพัฒนาชุดรูปแบบสามารถตั้งค่าลำดับของไฟล์เทมเพลตได้ คิดว่ามันคล้ายกับความจำเพาะตามที่ใช้กับตัวเลือก CSS เมื่อออกแบบบางอย่างคุณต้องการเริ่มต้นด้วยความเจาะจงน้อยที่สุดเพื่อให้สามารถเขียนทับได้ง่ายในส่วนของการออกแบบที่ต้องการความสนใจเป็นรายบุคคล

ตัวอย่างเช่นคุณกำลังจัดแต่งทรงผมในบล็อกและคุณสร้างไฟล์loop.phpซึ่งทำงานได้ดีในการทำเครื่องหมายโพสต์ แต่คุณวางแผนล่วงหน้าและคุณเรียกมันในไฟล์เทมเพลตของคุณในภายหลังพร้อมกับตัวระบุบริบทเพิ่มเติม - เช่นในหน้าดัชนีคุณโทรหาget_template_part( 'loop', 'index' );ในเทมเพลตเดียวคุณโทรหาget_template_part( 'loop', 'single' );ในหน้าเก็บถาวรคุณโทรget_template_part( 'loop', 'archive' );และอื่น ๆ นี้จะทำให้มันง่ายไปลงที่ถนนเมื่อคุณตัดสินใจที่จะทำเครื่องหมายห่วงเก็บบนหน้าเว็บของคุณแตกต่างจากหน้าแรก: เพียงแค่สร้างห่วง archive.phpแม่แบบและมันจะถูกนำมาใช้มากกว่าทั่วไปloop.php

แต่เวทย์มนตร์ที่อยู่เบื้องหลังget_template_part()นั้นอยู่ในฟังก์ชั่นlocate_template()ซึ่งจะตรวจสอบไดเรกทอรีธีมก่อนจากนั้นไดเรกทอรีหลัก (ถ้ามี) สำหรับไฟล์ที่มีชื่อ สิ่งนี้มีประโยชน์มากสำหรับการพัฒนาปลั๊กอิน หนึ่งในปลั๊กอินของฉันฉันกำหนดประเภทโพสต์ที่กำหนดเองและสร้างไฟล์เทมเพลตลูปสำหรับประเภทโพสต์ที่กำหนดเองนั้นในไดเรกทอรีปลั๊กอินของฉัน แต่ ... ฉันต้องการอนุญาตให้ใช้ธีมโดยใช้ปลั๊กอินเพื่อแทนที่มาร์กอัปของฉันหากพวกเขาเลือก นี่คือสิ่งที่ใช้locate_template()งานได้จริงมหัศจรรย์

locate_template($template_names, $load = false, $require_once = true )

จะค้นหาชื่อแต่ละชื่อในอาร์เรย์ $ template_names ในไดเรกทอรีสไตล์ชีทจากนั้นในไดเรกทอรีเทมเพลต ผ่าน 'true' เป็นอาร์กิวเมนต์ $ load หมายความว่าจะต้องพบไฟล์แรกและจะส่งคืนสตริงว่างถ้าไม่มีไฟล์เทมเพลต ดังนั้นฉันสามารถทำสิ่งนี้ในปลั๊กอินของฉัน:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

... ซึ่งหวังว่าจะทำให้มันง่ายมากสำหรับผู้พัฒนาธีมในการปรับแต่งปลั๊กอินของฉันโดยเพียงแค่รวมไฟล์ที่เรียกว่าloop-mycustomposttype.phpในธีมของพวกเขา


2
โปรดแทนที่ find_template ด้วยสิ่งนี้โปรด include(locate_template( 'loop-mycustomposttype.php')) วิธีนี้เป็นไปได้ที่จะผ่านตัวแปร ฉันได้พบได้ที่นี่การเชื่อมโยง มันมีประโยชน์มาก!
Pablo SG Pacheco

1
การทำเช่นนั้นจะเป็นสิ่งจำเป็นในการเปลี่ยนแปลงสิ่งนี้ ชอบสิ่งนี้if ( false === include(locate_template( 'loop-mycustomposttype.php')) )
Pablo SG Pacheco

1
โอ้จุดดี ด้วยสูตรที่ฉันให้requireหรือrequire_onceโทร (จากlocate_template) อยู่ภายในฟังก์ชั่นและดังนั้นจึงไม่สามารถเข้าถึงขอบเขตปัจจุบัน
goldenapples

5

ไม่ใช่ลูปทั้งหมดคือลูปหลัก ;-) ไม่ว่าคุณจะดูหน้าแรกหรือหมวดหมู่หรืออะไรก็ตามคุณจะมีวงหลักเสมอ เนื้อหาของลูปหลักนั้นจะถูกกำหนดโดยแบบสอบถามที่ถูกเรียกใช้ก่อนที่แม่แบบของคุณจะถูกเรียกเลย

เทมเพลต loop.php จะทำงานเฉพาะไอเท็มในลูป ดูเอกสารที่ Codex

ถ้าคุณดูที่ loop.php ของ Twenty-Ten คุณจะเห็นว่า Twenty-Ten นั้นกระจายอยู่ภายในไฟล์เทมเพลตเดียวนั้น

get_template_part()เพียงโหลดชิ้นส่วนเทมเพลตและวิ่งผ่านมัน คุณสามารถแยกส่วนของ loop.php ของคุณออกเป็นไฟล์แยกกันและแทนที่ด้วย a get_template_part('loop', 'category')และอื่น ๆ ในการโทร

หรือคุณอาจมีเทมเพลตชิ้นส่วนสำหรับโพสต์แต่ละรายการในลูปและให้ลูปของคุณ. php โทรget_template_part('loop','post');ภายในwhile...ข้อเท่านั้น ทั้งหมดขึ้นอยู่กับคุณ.


3

จากget_template_part codex :

<?php get_template_part( 'loop', 'index' ); ?>

จะทำ PHP ต้องการ () สำหรับไฟล์แรกที่มีอยู่ ...

ดังนั้นมันจะทำงานอย่างมีประสิทธิภาพราวกับว่าคุณต้องการไฟล์ php อื่น

อัปเดต : มีความแตกต่างเล็กน้อยสำหรับ 'ต้องการ' - มันถูกรวมอยู่ในฟังก์ชันดังนั้นคุณต้องglobalถ้าคุณต้องการส่งผ่านตัวแปรใด ๆ จากแม่แบบของคุณไปยังส่วนแม่แบบของคุณ

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