วิธีการแทนที่ฟังก์ชั่นที่เสียบได้ในธีม?


10

เอกสารทั้งหมดที่ฉันได้พบกล่าวถึงฟังก์ชั่นการเอาชนะได้ผ่านปลั๊กอินของคุณ

ถ้าคุณกำลังพัฒนาชุดรูปแบบแทนล่ะ

functions.php ของฉันต้องการไฟล์อื่นที่ใช้แทนข้อมูลที่ฟังก์ชั่นที่กำหนดไว้ในget_user_by()pluggable.php

หากฉันไม่รับif( function_exists() )สายฉันจะได้รับข้อผิดพลาด "ไม่สามารถประกาศใหม่ ... "

ถ้าฉันรวมการif( function exists() )โทรฉันก็จะไม่มีข้อผิดพลาด แต่แน่นอนว่าฟังก์ชั่นของฉันนั้นถูกละเว้นเพราะมีรุ่นที่เสียบได้

ขึ้นอยู่กับการโพสต์ที่ยอดเยี่ยมของโดมินิคตามลำดับการเริ่มต้น WordPressเป็นที่ชัดเจนว่าpluggable.phpโหลดก่อนธีมของคุณfunctions.phpและอื่น ๆ เพื่ออธิบายข้อผิดพลาด

ดังนั้นคำถามคือ - คุณจะใช้ประโยชน์จากสถาปัตยกรรม pluggable ที่ดีได้อย่างไรภายในธีมโดยไม่ต้องหันไปเขียนปลั๊กอินซึ่งจะต้องรวมหรือติดตั้งกับธีม?

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

บริบท : ฉันกำลังพัฒนาโซลูชัน CMS แบบครั้งเดียวสำหรับลูกค้าที่มีข้อมูลเมตาที่กำหนดเองจำนวนมากการกำหนดค่าส่วนหลังของผู้ดูแลระบบกระบวนการเข้าสู่ระบบ / การรับรองความถูกต้องที่กำหนดเอง และแน่นอนว่ามีองค์ประกอบการออกแบบ - ซึ่งเป็นที่ที่ชุดรูปแบบเข้ามาความจริงก็คือพวกนี้ไม่ใช่องค์ประกอบที่นำมาใช้ซ้ำได้ - พวกเขาจะไม่นำไปใช้กับลูกค้ารายอื่นพวกเขาจะไม่ถูกวางภายใต้ GPL และเปิดแหล่งที่มา แน่นอนว่าจะไม่แจกจ่าย / ติดตั้งในการปรับใช้ WordPress อื่น ๆ ที่ดีที่สุดมีแนวทางปฏิบัติที่ดีที่สุดฉันจะใช้ประโยชน์จากโครงการในอนาคต แต่นั่นจะเป็นงานอ้างอิง / คัดลอกวางอย่างเคร่งครัด

นี่ไม่ได้เสียงเหมือนกรณีการใช้งานสำหรับปลั๊กอินให้ฉัน มีการติดตั้งชุดรูปแบบอาจเป็นชุดรูปแบบลูกของ Twenty Eleven อาจเป็นรูปแบบสแตนด์อโลนฟังก์ชั่นของมันเรียกใช้ php ในรูปแบบของเรือรวมถึงการจัดการแต่ละด้านที่แตกต่างกันของ CMS ที่เป็นปัญหา จากนั้นไฟล์เท็มเพลตธีมใช้ 'เทมเพลตแท็ก' แบบกำหนดเองที่กำหนดไว้ในการรวม ฉันไม่ต้องการให้มีไฟล์ชุดรูปแบบที่มีการอ้างอิงในปลั๊กอินหรือการเปิดใช้งานอื่น ๆ มันไม่สมเหตุสมผลที่จะสร้างความซับซ้อนในระบบ แน่นอนว่าฉันสามารถวางไว้ในต้องใช้โฟลเดอร์ปลั๊กอิน แต่ที่ยังคงรู้สึกเหมือนสับ - ตอนนี้ทุกอย่างwp-content/themes/my-theme/ที่มีจะทำอย่างไรกับการปรับแต่งที่ทำสำหรับโครงการนี้มีอยู่ใน ฉันไม่ต้องการพิจารณาการค้นหาสิ่งต่าง ๆ ในโฟลเดอร์ปลั๊กอินบางอันด้วย

อย่าเข้าใจฉันผิด ฉันรักปลั๊กอินและฉันใช้มันและเขียนมัน และฉันจะใช้ปลั๊กอินร่วมกับการพัฒนาชุดรูปแบบที่กำหนดเองสูงนี้เมื่อปลั๊กอินเป็นบุคคลที่สามและแสดงถึงแนวทางปฏิบัติที่ดีที่สุดไกลเกินกว่าที่ฉันจะทำได้ในกรอบเวลาที่เหมาะสม แต่เมื่อฉันต้องการแก้ไขฟังก์ชันการทำงานหลักสำหรับสถานการณ์แบบครั้งเดียวฉันจะเปิดใช้ action hooks, filter hooks และฉันต้องการที่จะพึ่งพาฟังก์ชั่นที่เสียบปลั๊กได้สำหรับผู้ใช้และด้านการตรวจสอบสิทธิ์ของสิ่งต่าง ๆ


เพื่อขาว
Tom Auger

สำหรับตั๋วแล้วตั๋วถูกปิดอีกครั้งพร้อมคำอธิบายที่ดีว่าทำไม
Tom Auger

คำตอบ:


10

mu-pluginsหากคุณกำลังสร้างนี้สำหรับลูกค้าเดียวคุณอย่างควรใช้ประโยชน์จาก

มีจำนวนมากของสิ่งที่อยู่ใน WordPress functions.phpที่คุณไม่สามารถทำใน ฟังก์ชั่นแบบเสียบได้เป็นหนึ่งในพวกเขา แต่ที่เห็นได้ชัดมากขึ้นจำนวนของตะขอ (ทั้งการกระทำและฟิลเตอร์) functions.phpไฟก่อน ในบางกรณี hooks เหล่านี้จะเริ่มทำงานก่อนปลั๊กอินปกติซึ่งคุณต้องใช้mu-pluginsหรือปลั๊กอินที่เปิดใช้งานเครือข่าย ในกรณีอื่น ๆ แม้กระทั่งปลั๊กอิน mu ก็สายเกินไป sunrise.phpบางทีคุณอาจจะต้องการอะไรบางอย่างใน หรือแม้กระทั่งสิ่งที่ (คงที่หรืออื่น ๆ ) wp-config.phpใน

ฉันอยากจะเพิ่ม hooks ลงในฟังก์ชั่นที่เสียบได้ง่ายกว่าเพื่อให้ง่ายต่อการแทนที่มัน เราไม่น่าจะมีฟังก์ชั่นอื่นที่สามารถเสียบปลั๊กได้อีกครั้ง - พวกเขาติดตั้งตะขอไว้ล่วงหน้าและฉันแทบไม่เคยเห็นสถานการณ์ที่มีข้อได้เปรียบเหนือตะขอแบบเก่า ๆ

ฉันยังเห็นด้วยอีกหกปีต่อมากับ Andy Skelton - "มีความแตกต่างมากมายระหว่างไฟล์ฟังก์ชั่นของชุดรูปแบบกับปลั๊กอินเราคงไว้อย่างนั้น"

การเปลี่ยนแปลงเช่นนี้ไม่เคยเกิดขึ้นเลย มันจะทำลายหลายสิ่งหลายอย่าง รูปแบบนับไม่ถ้วนเรียกฟังก์ชั่นในร่างกายของfunctions.phpที่จะส่งผลให้เกิดข้อผิดพลาดร้ายแรงถ้าpluggable.phpไม่ได้โหลดแล้ว - ชอบหรือcurrent_user_can() wp_create_nonce()พวกเขาทั้งหมดล้มเหลว และมันก็จะแตกปลั๊กอินด้วยซึ่งโดยปกติจะสามารถเริ่มเรียกฟังก์ชันเหล่านี้plugins_loadedได้ (เพียงเลื่อนpluggable.phpลงด้านล่างwp-settings.phpและฉันเดิมพันครึ่งหนึ่งของแกนกลางจะพัง - หรืออย่างน้อยที่สุดเครื่องมือปรับแต่งจะทำ)

ในที่สุดก็มีความคิดที่หลีกเลี่ยงไม่ได้ว่าธีมอาจมีไฟล์แยกต่างหากเช่นpluggable.phpที่เราสามารถโหลดได้เร็วเท่าที่เราโหลดปลั๊กอินดังนั้นจึงสามารถแทนที่ฟังก์ชั่นที่เสียบได้ นอกเหนือจากนี้เป็นความคิดที่ไม่ดี (ดูสี่ย่อหน้าแรกของความคิดเห็นนี้) มันจะยังไม่เข้ากันได้เพราะจนถึงsetup_themeตะขอหนึ่งสามารถแทนที่ธีมที่จะโหลดโดยการกรองสไตล์ชีทและค่าแม่แบบ

น่าเสียดายที่สิ่งนี้ไม่สามารถรักษาได้เนื่องจาก WordPress ได้รับการออกแบบให้ดีขึ้นอย่างไร สิ่งที่ดีคือมีหลายวิธีที่จะทำ

(โพสต์ครั้งแรกที่นี่: http://core.trac.wordpress.org/ticket/2479#comment5 )


ขอบคุณที่สละเวลาโพสต์คำตอบของคุณที่นี่ เมื่อคุณอธิบายแล้วฉันเห็นสิ่งที่คุณทำ มีเหตุผล. ขอบคุณ!
Tom Auger

5

mu-pluginsในบริบทของโครงการครั้งหนึ่งปิดก็เป็นอย่างที่เหมาะสมที่จะลดลงรหัสที่ต้องใช้ลงใน หาก "การรวมทุกอย่างไว้ในที่เดียว" เป็นเรื่องที่น่ากังวลเพียงแค่สร้าง symlink ในชุดรูปแบบไปยังmu-pluginsดรอปอินดังนั้นมันจะปรากฏขึ้นเมื่อค้นหาไดเรกทอรีธีม


ทำเครื่องหมายขอบคุณสำหรับคำแนะนำเกี่ยวกับ symlink แม้ว่ามันจะไม่ได้ช่วยในการโยกย้าย แต่ก็สะดวกมากเมื่อพัฒนา
Tom Auger

0

ฉันไม่สามารถคิดวิธีที่จะบรรลุผลนี้เร็วเกินไปในการโหลดลำดับ

โซลูชันที่ใกล้เคียงที่สุดกับการมีสติจะเพิ่มการรวมแบบกำหนดเองไปที่wp-config.php(ตามรหัสหรือขอให้ผู้ใช้) แต่การเปรียบเทียบกับปลั๊กอินการรวมกลุ่มนั้นอาจเหมาะสมกว่า


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