ปลั๊กอินในไดเรกทอรี symlinked?


20

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

โครงสร้างไดเรกทอรีของฉันมีลักษณะเช่นนี้:

  • /path/to/wordpress/development/dir/
    • plugin-development/
      • monkeyman-rewrite-analyzer/
        • monkeyman-rewrite-analyzer.php
        • js/
          • monkeyman-rewrite-analyzer.js
    • versions/
      • 3.1/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer เป็น symlink ไปยังปลั๊กอินด้านบน
      • 3.1-multi-dir/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer เป็น symlink ไปยังปลั๊กอินด้านบน
      • 3.1-multi-domain/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer เป็น symlink ไปยังปลั๊กอินด้านบน

ถ้าฉันต้องการจัดคิวไฟล์ Javascript ฉันควรใช้plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] )แต่การใช้__FILE__ที่นี่จะไม่ทำงานเพราะเส้นทางของไฟล์ที่แท้จริงจะเป็น/path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.phpเช่นนั้นไม่ใช่/path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.phpดังนั้น WordPress จึงไม่สามารถตัดส่วนแรกออกและสร้าง URL ที่เกี่ยวข้องกับการติดตั้ง WordPress

คำตอบ:


6

ปัญหาสามารถแก้ไขได้บางส่วนด้วยปลั๊กอินที่ต้องใช้เกี่ยวกับplugins_urlตัวกรอง

มันจะไม่จัดการกับกรณีอื่น ๆ ทั้งหมดที่plugin_basename()ใช้เช่นregister_activation_hook()และ บริษัท

ข้อมูลเพิ่มเติม: http://core.trac.wordpress.org/ticket/16953


ฉันเชื่อว่าWP_PLUGIN_URLไม่แนะนำให้ใช้เพราะผู้ดูแลระบบควรได้รับอนุญาตให้เปลี่ยนชื่อไดเรกทอรีของปลั๊กอินนี้โดยเฉพาะ แต่มีเหตุผลอื่นที่ควรหลีกเลี่ยงหรือไม่ และแน่นอนตั๋วของคุณจะเป็นทางออกที่ง่าย
Jan Fabry

ในทางตรงกันข้าม. WP_PLUGIN_URL มี URL ที่ชี้ไปยัง dir 'ปลั๊กอิน' เท่านั้น ดูคำตอบที่อัปเดต
scribu

@ สมัคร: แต่ถ้าปลั๊กอินของฉันอยู่/external/folder/banana-plugin/แต่ผู้ดูแลระบบลิงก์ไปยังไดเรกทอรีนั้นเป็น/httpd-root/wp-content/plugins/apple-plugin/อย่างไร แล้วมันจะพยายามไป/wp-content/plugins/banana-plugin/ใช่ไหม? และฉันเชื่อว่าผู้ดูแลระบบควรมีอิสระในการเลือกชื่อไดเรกทอรีปลั๊กอินแต่ละรายการ
Jan Fabry

ฉันจะไม่เถียงกับคุณเกี่ยวกับเรื่องนี้อีกต่อไปเพราะฉันพบวิธีแก้ปัญหา: ตัวกรอง 'plugins_url' อัปเดตคำตอบอีกครั้ง
scribu

FWIW โซลูชันนี้อาจเกิดข้อผิดพลาดได้ง่ายและขึ้นอยู่กับปลั๊กอินของ devs โดยใช้เฉพาะ plugins_url () หลังจากโหลดปลั๊กอินทั้งหมดไม่เช่นนั้นคุณจะไม่สามารถลงทะเบียนตัวกรองได้ก่อนที่ฟังก์ชันจะถูกเรียกใช้ ปลั๊กอิน Akismet และอื่น ๆ อีกมากมายมีปัญหานั้น
jerclarke

3

ปัจจุบันฉันใช้เคล็ดลับเพื่อให้ได้ตำแหน่งไฟล์ที่สัมพันธ์กับ WordPress: wp_get_active_and_valid_plugins()คืนค่าพา ธ ของไฟล์และwp_settings.phpวนรอบไฟล์เหล่านั้นและรวมไฟล์ไว้ด้วย ดังนั้น$pluginตัวแปรทั่วโลกจะอ้างอิงถึงปลั๊กอินปัจจุบันของคุณ (แน่นอนเมื่อโหลดปลั๊กอินเท่านั้นดังนั้นฉันบันทึกไว้ในตัวแปรโกลบอลที่เติมคำนำหน้า):

$monkeyman_Rewrite_Analyzer_file = $plugin;

เนื่องจากปลั๊กอินสามารถโหลดได้ตามที่ต้องใช้หรือปลั๊กอินเครือข่ายและลูปเหล่านี้ใช้ชื่อตัวแปรอื่น ๆรหัสที่สมบูรณ์จึงมีลักษณะดังนี้:

$monkeyman_Rewrite_Analyzer_file = __FILE__;
if ( isset( $mu_plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $mu_plugin;
}
if ( isset( $network_plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $network_plugin;
}
if ( isset( $plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $plugin;
}

ทางเลือกยังคงเป็น__FILE__เช่นนั้นดังนั้นหากมีคนเปลี่ยนชื่อตัวแปรลูปในอนาคตรหัสของฉันยังควรใช้งานได้ถึง 99% ของการติดตั้งทั้งหมดเฉพาะการตั้งค่าการพัฒนาของฉันจะล้มเหลวและฉันสามารถปล่อยรุ่นใหม่ได้อย่างง่ายดาย


ทางออกที่ดี @Jan globalผมดำเนินการบางสิ่งบางอย่างที่คล้ายกันโดยการเรียกฟังก์ชั่นและวนลูปเพราะผมลืมตัวแปรเหล่านั้นสามารถเข้าถึงได้เป็น ขอบคุณที่โพสต์ของคุณที่นี่ฉันรู้ว่าฉันสามารถทำให้มันง่ายขึ้นมาก BTW ฉันกำลังทดสอบfalse === strpos( __FILE__, WP_CONTENT_DIR )ก่อนที่จะเรียกใช้คำสั่ง if ของคุณเพราะฉันสมมติว่าปลั๊กอินอยู่ในWP_CONTENT_DIRนั้นไม่ใช่การเชื่อมโยง; ฉันหวังว่านั่นเป็นตรรกะที่ถูกต้อง
MikeSchinkel

0

ความคิดเห็นในข้อผิดพลาด 46260แนะนำให้ใช้แทน$_SERVER["SCRIPT_FILENAME"] __FILE__มันใช้ได้ไหม?


1
ไม่สิ่งนี้จะไม่เปลี่ยนแปลงในไฟล์ที่รวมอยู่ ดังนั้นถ้าindex.phpมีlibrary.php, $_SERVER['SCRIPT_FILENAME']ในจะยังคงเป็นlibrary.php index.phpแต่ขอบคุณสำหรับการอ้างอิงถึงข้อบกพร่องฉันจะติดตามอย่างใกล้ชิด!
Jan Fabry

0

$_SERVER["SCRIPT_FILENAME"]ทำงานได้ถ้าคุณใช้มันถูกต้อง คุณเพียงแค่ใช้มันเพื่อตั้งค่าพา ธ ฐานแล้วรวมไฟล์ของคุณโดยใช้พา ธ ที่สัมพันธ์กับพา ธ ฐานนั้น

สิ่งที่ต้องการ:

$plugin_dir = dirname($_SERVER["SCRIPT_FILENAME"]);
$myFile = $plugin_dir."/includes/js/myJavascriptFile.js";

หมายเหตุสิ่งนี้มีประโยชน์มากขึ้นเมื่อคุณยังไม่สามารถเข้าถึง wp-blog-header.php ได้ (เช่นในการประมวลผลคำขอแบบฟอร์มที่ใช้ ajax)

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