จะรวมไฟล์โดยใช้ get_template_part () ในปลั๊กอินได้อย่างไร?


13

คำถามง่ายๆอาจเป็นไปได้ แต่ฉันกำลังดิ้นรน ในการพัฒนาชุดรูปแบบฉันทำงานกับget_template_part()หลายครั้งและฉันเข้าใจพื้นฐานของมัน แต่เมื่อฉันพัฒนาปลั๊กอินฉันสงสัยว่ามันใช้เพื่อแสดงข้อผิดพลาด:

แจ้งให้ทราบล่วงหน้า: การใช้ STYLESHEETPATH ​​คงไม่ได้กำหนด - สันนิษฐานว่า 'STYLESHEETPATH' ใน...\wp-includes\template.phpบรรทัด 407

และ

ประกาศ: ใช้ค่าคงที่ TEMPLATEPATH - สันนิษฐานว่า 'TEMPLATEPATH' ใน...\wp-includes\template.phpบรรทัด 410

Googling ปัญหาพบว่ามีการแก้ไขที่รองรับ:

แต่นั่นก็เป็นวิธีแก้ปัญหาที่ยิ่งใหญ่ - ฉันสงสัยมัน ฉันคิดว่าไม่ควรซับซ้อนมาก ฉันตรวจสอบคำตอบ WPSEนี้และพบบรรทัดของรหัสนี้:

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

ที่ไหนมีinclude()ฟังก์ชั่นPHP ตามความรู้ WordPress ของฉันฉันได้เรียนรู้ที่จะชอบget_template_part()มากกว่า include()PHP จากนั้นฉันจะใช้get_template_part()ปลั๊กอินง่ายๆได้อย่างไร

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

get_template_part( 'my', 'special-admin' );

และหลังจากข้อผิดพลาดเปลี่ยนเป็น:

get_template_part( 'my', 'specialadmin' );

แต่คุณรู้ว่าไม่ใช่ปัญหา ฉันอยู่บนเซิร์ฟเวอร์ในพื้นที่โดยใช้ WAMP

คำตอบ:


11

get_template_partเป็นฟังก์ชั่นชุดรูปแบบ คุณไม่สามารถโหลดไฟล์ปลั๊กอินด้วยฟังก์ชันนั้น locate_templateลองดูที่แหล่งที่มาและคุณจะสังเกตเห็นการทำงานจะทำโดย ดูที่แหล่งนั้นและคุณจะเห็นว่ามันโหลดจากไดเรกทอรีธีมเสมอ

อย่างไรก็ตามคุณอาจต้องการใช้get_template_partมันเป็นฟังก์ชั่นที่ผิด

คุณจะต้องincludeไฟล์ของคุณ

เหตุผลที่ทำให้ฉันดูเหมือนว่าสำหรับget_template_partคือการอนุญาตให้มีการขยายชุดรูปแบบ - aka เพื่อความสะดวกในการสร้างชุดรูปแบบของเด็ก ปลั๊กอินไม่ได้มีวัตถุประสงค์เพื่อขยายในลักษณะนั้นดังนั้นจึงไม่จำเป็นต้องใช้get_template_partหรือสำหรับปลั๊กอินใด ๆ ที่เทียบเท่า


6

@s_ha_dum ถูกต้องซึ่งget_template_partเป็นฟังก์ชันธีม แต่ไม่ถูกต้องที่ปลั๊กอินไม่ได้มีวัตถุประสงค์เพื่อขยายในลักษณะนี้ มันซับซ้อนมากขึ้น

โพสต์นี้โดย Pippin อธิบายถึงวิธีการใช้ฟังก์ชั่นที่จะทำการโหลดเทมเพลตปลั๊กอินของคุณในขณะที่อนุญาตให้ผู้ใช้แทนที่เทมเพลตปลั๊กอินของคุณภายในธีมของพวกเขา

โดยพื้นฐานแล้วจะมีลักษณะเป็นโฟลเดอร์พิเศษในชุดรูปแบบจากนั้นหากไม่พบที่นั่นจะมีลักษณะอยู่ภายในโฟลเดอร์แม่แบบสำหรับปลั๊กอิน


4

ดังที่ได้กล่าวไว้ก่อนหน้านี้คุณไม่สามารถใช้get_template_partในปลั๊กอินได้ แต่มีคลาสที่ใช้งานง่ายบน Github (สร้างโดย Gary Jones) ที่เลียนแบบการget_template_partทำงานในปลั๊กอินเพิ่มปลั๊กอินลงในทางเลือก (ธีมลูก> ธีมหลัก> ปลั๊กอิน)

ด้วยวิธีนี้คุณสามารถแทนที่ "แม่แบบส่วน" ของปลั๊กอินในธีมลูกหรือธีมหลัก

การใช้งาน (นำมาจากคำแนะนำการซื้อคืน Github):

  1. คัดลอกclass-gamajo-template-loader.phpลงในปลั๊กอินของคุณ มันสามารถเป็นไฟล์ในปลั๊กอินรูตหรือดีกว่ารวมถึงไดเรกทอรี
  2. สร้างไฟล์ใหม่เช่นclass-your-plugin-template-loader.phpในไดเรกทอรีเดียวกัน
  3. สร้างในแฟ้มที่ที่ขยายclassGamajo_Template_Loader
  4. แทนที่คุณสมบัติคลาสเพื่อให้เหมาะกับปลั๊กอินของคุณ คุณสามารถลบล้างget_templates_dir()วิธีการได้หากวิธีนี้ไม่เหมาะกับคุณ
  5. ตอนนี้คุณสามารถสร้างคลาสตัวโหลดเทมเพลตที่กำหนดเองของคุณและใช้เพื่อเรียกget_template_part()เมธอด สิ่งนี้อาจอยู่ในการเรียกกลับย่อหรือสิ่งที่คุณต้องการให้ผู้พัฒนาธีมรวมไว้ในไฟล์ของพวกเขา

รหัสตัวอย่าง:

// Template loader instantiated elsewhere, such as the main plugin file.
$meal_planner_template_loader = new Meal_Planner_Template_Loader;

// Use it to call the get_template_part() method. This could be within 
// a shortcode callback, or something you want theme developers 
// to include in their files.
$meal_planner_template_loader->get_template_part( 'recipe' );

// If you want to pass data to the template, call the set_template_data() 
// method with an array before calling get_template_part().        
// set_template_data() returns the loader object to allow for method chaining.
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

$meal_planner_template_loader
    ->set_template_data( $data );
    ->get_template_part( 'recipe' );

// The value of bar is now available inside the recipe template as $data->foo.
// If you wish to use a different variable name, add a second parameter 
// to set_template_data():
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

$meal_planner_template_loader
    ->set_template_data( $data, 'context' )
    ->get_template_part( 'recipe', 'ingredients' );

// The value of bar is now available inside the recipe template as $context->foo.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.