หมายเหตุ:คำตอบนี้อยู่ที่นี่เพื่อให้การสนทนาระหว่าง @scribu และ @kaiser ง่ายขึ้น Mods: โปรดอย่าลบ ผู้ใช้ / ผู้อ่าน: โปรดอย่าลงคะแนน หากคุณต้องการติดตามการสนทนาให้ดูที่บันทึกการแก้ไข / แก้ไข หากคุณต้องการเข้าร่วมการสนทนาให้แก้ไขคำตอบ หากการสนทนามีผลก็จะถูกทำเครื่องหมายเช่นนั้น ขอบคุณ.
สถานการณ์
นอกจากนี้ยังมีสถานการณ์ที่แตกต่างกันซึ่งมีน้ำหนักแตกต่างกันซึ่งคุณสามารถพึ่งพาปลั๊กอินได้ (ตัวอย่างเป็นเพียงตัวละครเท่านั้น) ปลั๊กอิน "(พาเรนต์)" สามารถแลกเปลี่ยนกับ "ธีม" จากมุมมองพาเรนต์
- (ยาก) ปลั๊กอินลูกที่ขยายการทำงานหรือเปลี่ยนแปลงการแสดงผล (และที่คล้ายกัน) ของปลั๊กอินที่มีอยู่และดังนั้นจึงไม่สามารถอยู่ได้หากไม่มีพาเรนต์ ตัวอย่าง: BuddyPress » BuddyPress-FunkyCommentDisplay
- (ปกติ) ปลั๊กอินที่มีการขยายการทำงานเมื่อเปิดใช้งานปลั๊กอินลูก ตัวอย่าง: jQueryAttachmentCarousel » jQuerySlideDeck
- (อ่อน) ปลั๊กอินที่เพิ่งเพิ่มคุณสมบัติ ตัวอย่าง: DisneyWonderlandTheme » MickeysSocialLinks
ในต่อไปนี้ฉันพยายามที่จะร่างสิ่งที่เกิดขึ้นเมื่อคุณอัปเดตปลั๊กอิน "อื่น ๆ " และการตรวจสอบไม่ทำงานอีกต่อไป
- โฆษณา 1) ปลั๊กอินไม่สามารถใช้งานได้หากไม่เปิดใช้งาน BuddyPress »สิ่งต่าง ๆ เสียหายอย่างสมบูรณ์
- โฆษณา 2) ปลั๊กอินไม่สามารถให้ตัวเลือกในการเปลี่ยนจาก Carousel เป็น SlideDeck »แสดงสาย (ฉันคิดว่าสไตล์นั้นได้รับการแก้ไขเป็น SlideDeck)
- โฆษณา 3) MickeysSocialLinks หายไป
ตรวจสอบ
มีความเป็นไปได้ที่ imho สามวิธีในการตรวจสอบหากคุณต้องการทราบว่าปลั๊กอินใช้งานอยู่หรือไม่:
- A. มีโฟลเดอร์อยู่หรือไม่?
- B. ไฟล์หลัก - ตัวเลือก
'active_plugins'
- มีอยู่หรือไม่?
- C. มีฟังก์ชันเฉพาะหรือไม่?
ถ้าตอนนี้ฉันใช้ปลั๊กอินตัวตรวจสอบการเชื่อมโยงภายในของฉันเป็นตัวอย่างซึ่งไม่มี API สาธารณะและไม่ได้หมายถึงการขยายดังนั้นฉันจะไม่เห็นเหตุผล (ในฐานะผู้เขียน) ที่จะไม่เปลี่ยนการตั้งชื่อฟังก์ชั่นภายในตามความต้องการ . ดังนั้นหากใครบางคนพยายามที่จะ piggyback บนปลั๊กอินนี้แล้วสิ่งต่าง ๆ ก็จะพัง (ขึ้นอยู่กับฟังก์ชั่นและความหนาแน่นของการรวมกลุ่ม) ในการอัปเดต เช่นเดียวกับชื่อไฟล์ ฉันไม่มีเหตุผลที่แท้จริง (นอกเหนือจากนั้นปลั๊กอินจะถูกปิดการใช้งานในการอัปเดต) เพื่อไม่เปลี่ยนชื่อไฟล์ สิ่งเดียวที่ทำให้ฉันไม่สามารถเปลี่ยนชื่อโฟลเดอร์ได้คือการตรวจสอบและแจ้งเตือนการอัปเดตทำงานกับชื่อไฟล์ - หากเป็นโฮสต์ใน repo อย่างเป็นทางการ
ดังนั้นฉันจะพูดว่าจากจุดอ่อน (ง่ายต่อการเปลี่ยนแปลง) ไปจนถึงสิ่งที่ยากที่สุด (มากพูดกับการเปลี่ยนแปลง) ส่วนหนึ่งของปลั๊กอิน (หลัก) จะเป็น:
ฟังก์ชั่น»ชื่อไฟล์หลัก»โฟลเดอร์
เมื่อฉันบอกว่าการตรวจสอบฟังก์ชั่นนั้นมีความเปราะบางน้อยกว่าการใช้is_plugin_active()
ฉันสันนิษฐานว่าฟังก์ชั่นที่เป็นปัญหานั้นเป็นสิ่งที่ผู้เขียนปลั๊กอินสนับสนุน ตัวอย่างที่ดีที่สุดคือwp_pagenavi()
แท็กเทมเพลตที่เสนอโดยปลั๊กอิน WP-PageNavi
ปัญหาในการกำหนดการพึ่งพาคือไม่มีวิธีมาตรฐานในการระบุปลั๊กอินที่ไม่เกี่ยวข้องกับชื่อไฟล์
ความคิดเพิ่มเติมเกี่ยวกับเรื่อง:
http://wordpress.org/support/topic/plugin-plugin-dependencies-unreliable-plugin-namingidentifying-scheme
ฉันเดาว่าเราสามารถสรุปได้สามจุด:
- เราได้พูดคุยเกี่ยวกับหัวข้อที่แตกต่างกันเล็กน้อย
- เรายอมรับว่าไม่มีวิธีกันกระสุนเพื่อหลีกเลี่ยงสิ่งที่ฉันคิดว่าเป็นหัวข้อ
- จากความเข้าใจในคำถามคุณได้เสนอวิธีการที่ถูกต้อง
วิธีที่ฉลาดที่สุดที่ฉันสามารถคิดได้ว่าฉันเคยเห็นในปลั๊กอิน (มากไป) ที่:
// inside the plugin file:
add_action( 'plugin_custom_hook', 'plugin_trigger' );
// inside some template:
do_action( 'plugin_custom_hook' );
โดยไม่ได้คิดถึงรายละเอียดมากเกินไป แต่ฉันคิดว่าคุณสามารถขอให้คุณแจ้งให้ทราบในตัวกรอง 'ทั้งหมด' และตรวจสอบภายในตัวกรองปัจจุบันถ้ามันถูกเรียกเมื่อคุณอยู่ในshutdown
ตะขอ ... ?
การใช้ hooks จะทำงานได้ดีสำหรับการพึ่งพา 'ปกติ' และ 'อ่อนแอ' ข้อเสียเปรียบเพียงอย่างเดียวคือคุณยังคงต้องใช้function_exists()
หรือis_plugin_active()
หากคุณต้องการหยุดหากไม่สามารถพึ่งพาได้ การใช้ตัวกรอง 'ทั้งหมด' สำหรับนั้นจะแพงเกินไป IMO
@scibu เป้าหมายนี้เป็นหัวข้อ "ของคุณ" (ฉันพูดเรื่องของฉันไปแล้ว) :)
ดังนั้นโดยทั่วไปถ้าคุณต้องการการพึ่งพา - และคุณมีผู้เขียนที่ดี - จากนั้นเขาสามารถเสนอเบ็ดแทน / แทนแท็กแม่แบบ เนื่องจากปลั๊กอินจะเชื่อมต่อเข้าด้วยกันเฉพาะเมื่อมีการขอติดตั้งหรือไม่ต้องทำอะไรเลย และในอีกด้านหนึ่งคุณจะไม่มีข้อผิดพลาดเมื่อไม่มีปลั๊กอิน
นี่คือส่วนที่ยาก (หรือมากกว่าของ Q): การเขียนแจ้งผู้ดูแลระบบจะแจ้งให้ผู้ใช้เกี่ยวกับ dependancy "คุณจำเป็นต้องติดตั้ง» DisneyWonderLinks «" array_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] )
คุณสามารถตรวจสอบ ฉันไม่แน่ใจว่าจะใช้งานได้หรือไม่ แต่อาร์เรย์ควรจะสามารถเข้าถึงได้ทั้งสองด้าน (สาธารณะ / ผู้ดูแลระบบ)
ที่จะไม่ทำงาน เพียงเพราะการลงทะเบียนโทรกลับไปที่ตะขอไม่ได้หมายความว่าเบ็ดจะถูกเรียกเมื่อคาดหวัง สิ่งเดียวที่จะเรียงลำดับของงานคือการใช้เบ็ด 'ปิด' ซึ่งคุณกล่าวถึงก่อนหน้านี้:
add_action( 'shutdown', function() {
if ( !did_action( 'template_tag_like_hook' ) )
echo 'Problem.';
} );
แน่นอนว่าสิ่งนี้จะถูกพิมพ์ที่ด้านล่างสุดหลังจาก</html>
แท็กบนส่วนหน้า (เนื่องจากเป็นที่ที่แท็กแม่แบบใช้งานตามปกติ) ซึ่งไม่ได้ใช้งานมากนัก
คุณสามารถลองเก็บข้อความไว้ใน wp_options จากนั้นแสดงมันในพื้นที่ admin แต่นั่นจะเปิดเวิร์มกระป๋องใหม่ทั้งหมด: การทำให้ใช้ไม่ได้ปลั๊กอินการแคชเป็นต้น
function_exists
ผู้ใช้ปกติก็จะได้รับข้อความว่าเขาไม่ได้ติดตั้งปลั๊กอินที่ใช้ปลั๊กอินตัวอื่น ปัญหาคือว่าผู้ใช้จริงจะมีปลั๊กอินที่ติดตั้งแล้วเพียงแค่สงสัยว่าทำไมมันdoens't ทำงาน โอ้และฉันจะไม่ลงคะแนนให้คุณอย่างนั้น