วิธีรวมไฟล์ PHP ในปลั๊กอินในวิธีที่ถูกต้อง


59

ปัญหาของฉันคือเมื่อไฟล์ปลั๊กอินหลักฉันรวมไฟล์ PHP สิ่งนี้:

include(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
include_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
require(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
require_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');

และในไฟล์นั้นฉันมีการเรียกไปยังฟังก์ชั่น WordPress เช่น:

add_action('hook', 'callback');

และฉันได้รับ:

ข้อผิดพลาดร้ายแรง: การเรียกไปยังฟังก์ชั่นที่ไม่ได้กำหนด add_action ()

ตอนนี้ก่อนที่คุณจะพูดว่า "ใช้if(**function_exists**('add_action')){" ถ้าฉันใช้สิ่งนั้นมันก็ไม่ทำงาน

คำถาม:

  • อะไรจะเป็นวิธีที่ถูกต้องในการทำเช่นนั้น?
  • อะไรคือความแตกต่างระหว่างinclude, include_once, requireและเมื่อฉันจะใช้แม่มด?

คุณกำลังทำอะไรผิดพลาดถ้าคุณได้รับข้อความนั้น ตรวจสอบให้แน่ใจว่าคุณใส่ไฟล์ใด ๆ ก่อนที่คุณจะเริ่มใช้งานฟังก์ชั่นจากไฟล์เหล่านี้
onetrickpony

ไม่เลยสายอยู่ในไฟล์ที่ฉันรวมอยู่ด้วย!
Bainternet

ฮ่า ๆ ตอนนี้ฉันเห็นWP_PLUGIN_URLในรหัสของคุณข้างต้น :)
onetrickpony

3
ใส่ได้อย่างง่ายดายเพียงคุณสามารถรวมไฟล์ () ผ่านทางพา ธ ไม่ใช่ URI
บรรณาธิการ

1
บทความ Codex นี้ (อาจเขียนหลังจากที่คุณถามคำถามของคุณ) มีประโยชน์มาก: codex.wordpress.org/Determining_Plugin_and_Content_Directories
henrywright

คำตอบ:


88

มางานปาร์ตี้สายนี้ แต่นี่เป็นวิธี "WordPress": การใช้งานplugin_dir_path( __FILE__ )เช่น:

<?php
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');
?>

โปรดทราบว่าฟังก์ชั่นจะส่งกลับเครื่องหมายสแลชต่อท้ายสำหรับพา ธ ไฟล์


3
โปรดทราบว่าการใช้__FILE__มันจะส่งออกสัมพันธ์กับไฟล์ปัจจุบันที่คุณเรียกใช้ดังนั้นหากincludeคำสั่งของคุณทำจากไดเรกทอรีย่อยภายในโครงสร้างไฟล์ปลั๊กอินคุณจะได้รับไดเรกทอรีย่อยด้วย
squarecandy

ทางเลือก - ถ้าคุณต้องการเส้นทางญาติคือrequire_once(plugin_dir_path(__DIR__).'/myfile.inc');
FoggyDay

10

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

กำหนดไดเรกทอรีปลั๊กอินของคุณ

ข้างในปลั๊กอินของคุณมีคำจำกัดความต่อไปนี้เพื่อกำหนดตำแหน่งปลั๊กอินปัจจุบัน

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

define( 'PLUGIN_DIR', dirname(__FILE__).'/' );  

เพียงรวมถึงตรงหรือต้องการ

คุณสามารถใช้; รวม, include_once, ต้องการหรือ require_once ภายในโฟลเดอร์ปลั๊กอินของคุณโดยการอ้างอิงตำแหน่งเช่นในรหัสตัวอย่างด้านล่าง ตัวอย่างด้านล่างจะอ้างอิงจากไฟล์ในไดเรกทอรีรากของคุณรวมถึงไฟล์อื่นจากภายในโฟลเดอร์ภายในโฟลเดอร์ปลั๊กอินของคุณ

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

include "classes/plugin-core.php";

ญาติรวมถึงสามารถนำทุกปัญหาที่ไม่คาดคิดที่น่ารังเกียจ
ทำเครื่องหมาย Kaplun

5

ฉันสิ้นสุดการส่งต่อโครงสร้าง WordPress สำหรับการรวมและใช้สิ่งต่อไปนี้:

require_once(dirname(__FILE__) . '/filename.php);

ฉันไม่คิดว่ามันจะแก้ปัญหาของคุณได้จริงซึ่งน่าจะเป็นปัญหาขอบเขต แต่เป็นรหัสที่ฉันใช้

สำหรับความแตกต่างระหว่างการรวมและต้องการ:
รวมจะโยนคำเตือนหากไม่พบไฟล์
จำเป็นต้องใช้จะมีข้อผิดพลาดร้ายแรงหากไม่พบไฟล์

include_once และ require_once จะไม่รวม / ต้องการไฟล์ / รหัสอีกครั้งหากมีการรวม / จำเป็นแล้ว (โปรดทราบว่าเท่าที่ฉันสามารถบอกได้นี่เป็นเพียงไฟล์ที่ระบุในไดเรกทอรีที่ระบุเท่านั้น)


5

ก่อนอื่นขอบคุณทุกคนที่ตอบกลับ

ปัญหาของฉันคือเรียกไฟล์ที่รวมมาพร้อมกับ URL แบบเต็มเพื่อไม่ให้ผ่าน WordPress และที่เกิดขึ้นเพราะตามที่ฉันระบุไว้ในคำถามที่ฉันถูกเรียกพวกเขาจากไฟล์ปลั๊กอินหลัก ดังนั้นการแก้ไขโดยใช้:

include_once('/ipn/paypal-ipn.php');

ผมอ่านเกี่ยวกับที่สนับสนุน WordPress และขอบคุณอีกครั้งสำหรับการตอบรับ!


คุณช่วยโปรดพิจารณาอีกครั้งเพื่อทำเครื่องหมายคำตอบนี้ ( wordpress.stackexchange.com/a/32002/123092 ) เป็นที่ยอมรับได้หรือไม่?
ฉันเป็นคนที่โง่ที่สุด

4

ประกอบด้วย

คำสั่ง include () รวมถึงและประเมินไฟล์ที่ระบุ

รวมหนึ่งครั้ง

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

จำเป็นต้อง

require () และ include () เหมือนกันทุกประการยกเว้นวิธีจัดการกับความล้มเหลว พวกเขาทั้งสองสร้างคำเตือน แต่ต้องการ () ผลลัพธ์ในข้อผิดพลาดร้ายแรง กล่าวอีกนัยหนึ่งอย่าลังเลที่จะใช้ require () หากคุณต้องการให้ไฟล์ที่ขาดหายไปหยุดการประมวลผลของหน้าเว็บ

ต้องใช้ครั้งเดียว

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

ข้อมูลข้างต้นมาจากเอกสาร PHP สิ่งที่ไม่ถูกต้องขึ้นอยู่กับความต้องการของรหัสฉันต้องการ () กับสิ่งที่สำคัญเช่นฟังก์ชั่น แต่ในไฟล์ธีมเช่นส่วนท้ายหรือลูปที่ฉันใช้ include_once หรือรวมเพราะฉันสามารถจัดการคำเตือนและพูดกับผู้ใช้ / ผู้เข้าชมที่เกิดข้อผิดพลาดแทนที่จะเป็นเพียง fatal_error


ในฐานะที่ @mtekk บอกว่าฉันจะแนะนำให้คุณใช้โครงสร้างมอก.: require_once (dirname ( FILE ). '/filename.php);
Webord

1

สวัสดี@ בנייתאתרים:

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

คุณได้รับ"ปลั๊กอิน"เพื่อโหลดใคร คุณกำลังใช้include*()หรือrequire*()โหลดไฟล์อาจอยู่ในwp-config.phpไฟล์ของคุณหรือไม่


1
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');

หรือ

define( 'PLUGIN_ROOT_DIR', plugin_dir_path( __FILE__ ) );
include( PLUGIN_ROOT_DIR . 'ipn/paypal-ipn.php');

หรือ

$plugin_dir_path = plugin_dir_path( __FILE__ );
include( $plugin_dir_path . 'ipn/paypal-ipn.php');

หมายเหตุ: เพื่อเปิดใช้งานไฟล์. css & .js admin_enqueue_scriptsภายในปลั๊กอินใช้plugin_dir_url( __FILE__ )

$plugin_dir_uri = plugin_dir_url( __FILE__ );
wp_enqueue_style( 'plugin-style', $plugin_dir_uri . 'css/plugin-style.css');

0

เมื่อใดก็ตามที่คุณสร้างไฟล์ใหม่ในไดเรกทอรีการทำงานของคุณคุณจะต้องรวมไฟล์ทุกครั้ง แต่ลองใช้วิธีการสแกน directroy ของคุณและแนบมันโดยอัตโนมัติไม่เพียง แต่ไฟล์ php ซึ่งช่วยในการรวม php, js และ css fiules อย่างถูกต้องทั้งสองด้าน (แบ็กเอนด์ส่วนหน้า)

http://kvcodes.com/2014/05/wordpress-theme-development-include-files-automatically/


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