จะเลิกใช้ฟังก์ชั่นที่ใช้ในปลั๊กอินได้อย่างไร?


17

หนึ่งในฟังก์ชั่นที่ฉันใช้ในปลั๊กอินของฉันคือสร้างมลภาวะระดับโลกด้วยชื่อที่สามารถชนกับฟังก์ชั่นอื่น (ใช้ในปลั๊กอินอื่น) ดังนั้นฉันคิดว่าฉันควรเลิกใช้แล้ว แต่ฉันจะไปเกี่ยวกับเรื่องนั้นได้อย่างไร

function foo() {
    echo 'bar';
}

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

Ref: https://developer.wordpress.org/reference/functions/_deprecated_function/


เป็นคำถามที่ดี แต่อาจถึงเวลากำหนดปลั๊กอินของคุณหรือไม่ คุณยังสามารถเรียกใช้ namespace ใหม่จากฟังก์ชั่นที่เลิกใช้แล้วของคุณ ...
brianlmerritt

Namespacing เป็นตัวเลือกที่ฉันต้องการสำรวจ แต่ยังไม่ได้ตัดสินใจว่าจะให้การสนับสนุน PHP 5.2 หรือยัง
henrywright

การโหลดทางเลือกที่ไม่รองรับถ้ารุ่น php ต่ำเกินไป แต่การกำหนดเนมสเปซเป็นอย่างอื่นอาจทำให้คุณเปลี่ยนเส้นทางได้ ข้อความที่เลิกใช้แล้วอาจเป็น "ผู้ให้บริการโฮสติ้งของคุณไม่รองรับ PHP 5.3+ blah blah ฯลฯ "
brianlmerritt

คำตอบ:


11

นอกจากคำตอบโดย @Welcher:

มีตัวอย่าง " สุสาน " ที่ดีในแกนกลางซึ่ง " ฟังก์ชั่นมาถึงที่ตายแล้ว "

คุณสามารถใช้พวกเขาเป็นแนวทางเช่นเกี่ยวกับเอกสาร

นี่คือตัวอย่างหนึ่งสำหรับpermalink_link()ภายใต้wp-includes/deprecated.php

/**
 * Print the permalink of the current post in the loop.
 *
 * @since 0.71
 * @deprecated 1.2.0 Use the_permalink()
 * @see the_permalink()
 */
function permalink_link() {
        _deprecated_function( __FUNCTION__, '1.2', 'the_permalink()' );
        the_permalink();
}

นี่คือเอกสารแบบอินไลน์สำหรับ_deprecated_functionฟังก์ชั่นที่อธิบายถึงข้อโต้แย้งการป้อนข้อมูล:

/**
 * Mark a function as deprecated and inform when it has been used.
 *
 * There is a hook deprecated_function_run that will be called that can be used
 * to get the backtrace up to what file and function called the deprecated
 * function.
 *
 * The current behavior is to trigger a user error if WP_DEBUG is true.
 *
 * This function is to be used in every function that is deprecated.
 *
 * @since 2.5.0
 * @access private
 *
 * @param string $function    The function that was called.
 * @param string $version     The version of WordPress that deprecated the function.
 * @param string $replacement Optional. The function that should have been called. 
 *                            Default null.
 */

1
ขอบคุณสำหรับสิ่งนี้. ฉันไม่คิดว่าจะดูวิธีการที่ดำเนินการโดยหลัก! ดังนั้นฉันคิดว่านี่เป็นขั้นตอนที่ฉันต้องทำ 1) ลบเนื้อหาต้นฉบับทั้งหมดออกจากฟังก์ชั่นของฉัน 2) เพิ่มการโทรถึง_deprecated_function()3) เพิ่มการเรียกไปยังฟังก์ชั่นใหม่ของฉันซึ่งจะแทนที่สิ่งเก่า
henrywright

1
ฟังดูเหมือนปัญหาสองด้านที่กล่าวถึงที่นี่ - การคัดค้านและการชนชื่อที่เป็นไปได้ ฉันได้แก้ไขส่วนแรกที่นี่ตามชื่อของคำถามเท่านั้น
Birgire

1
@ MarkKaplun ฉันยอมรับว่ามี 2 ประเด็นที่เกิดขึ้น คำถามคือทำอย่างไรจึงจะเลิกใช้ฟังก์ชั่นและนั่นคือสิ่งที่คำตอบของฉันตั้งอยู่ การแจ้งเตือน __doing_it_wrong สำหรับนักพัฒนาที่กำลังเรียกวิธีการนี้ในรูปแบบของพวกเขา ฯลฯ เพื่อให้พวกเขาตอบสนองต่อการเปลี่ยนแปลงใน API แทนที่จะเป็นหน้าจอสีขาว ประกาศที่เลิกใช้งานแล้วเป็นปลั๊กอิน dev ที่ยอดเยี่ยมที่ช่วยให้คุณติดตามการเปลี่ยนแปลงหลัก ๆ ได้ตลอดเวลาและจะช่วยในกรณีนี้เช่นกัน
Welcher

1
@ MarkKaplun ฉันเห็นจุดของคุณ ฉันจะโต้แย้ง แต่ส่วนหนึ่งของการคัดค้านคือการรักษาความเข้ากันได้ย้อนหลังจนกว่ารายการจะถูกลบออกจาก API ประเด็นของการแจ้งเตือน (ไม่ว่าจะใช้วิธีการใดในการสร้างมัน) คือการแจ้งให้นักพัฒนาซอฟต์แวร์ทราบโดยใช้วิธีการที่จะถูกลบออกและให้เวลาพวกเขาในการดำเนินการตามนั้น วิธีการเลิกบางสิ่งบางอย่างคือการเน้นและลบมันวิธีการที่เหมาะสมคือการให้ผู้ใช้หัวขึ้นครั้งแรก :)
Welcher

2
@ MarkKaplun ฉันไม่แน่ใจว่าสิ่งที่คุณโต้เถียง (หรือเพื่อ?) คำถามคือทำอย่างไรจึงจะเลิกใช้วิธีการและชัดเจนโดยข้อเท็จจริงที่ว่า OP กล่าวว่า "ปลั๊กอินของฉัน" รู้ว่าการเลิกใช้หมายความว่าเขาเป็นนักพัฒนา ผู้ใช้จินตนาการที่คุณกำลังพูดถึงไม่มีอะไรเกี่ยวข้องกับคำถามเฉพาะนี้ หากคุณกังวลเกี่ยวกับการรับการแจ้งเตือนนับล้านครั้งในบันทึกวิธีการที่เป็นปัญหาจะแสดงเฉพาะเมื่อเปิดใช้งาน WP_DEBUG และจนถึงจุดที่คุณไม่ได้เปิดใช้งานโดยผู้พัฒนาที่ไม่ใช่นักพัฒนา ฉันจะกราบเห็นด้วยอย่างยิ่งที่จะไม่เห็นด้วยกับการย้าย :)
Welcher

7

การตัดค่าเสื่อมราคาไม่เท่ากับการลบเสมอโดยปกติจะหมายถึงรายการนั้นถูกทำเครื่องหมายสำหรับการลบ EVENTUAL จาก API นี่เป็นวิธีการที่จะถูกเรียกจากภายนอก - เช่นเดียวกับปลั๊กอินหรือนักพัฒนาอื่น ๆ หรือไม่? หากวิธีการนี้ใช้โดยปลั๊กอินเท่านั้นภายในคุณสามารถลบออกได้อย่างปลอดภัยด้วยฟังก์ชันชื่อที่ดีกว่า

ถ้าไม่ฉันจะสร้างฟังก์ชั่นที่มีชื่อดีกว่าและมีหนึ่งชื่อที่ไม่ดีด้วยการ__doing_it_wrongโทร - อ่านเกี่ยวกับมันในcodexนี้จะให้เวลานักพัฒนาอื่น ๆ ที่จะปรับปรุงการอ้างอิงถึงวิธีการและคุณสามารถลบวิธีใน รุ่นที่ใหม่กว่า

function badly_named() {

    __doing_it_wrong( 'badly_named', 'This method has been deprecated in favor of better_named_function' );

    /**
     * Call the better named method
     */
     better_named_function();
}

หวังว่านี่จะช่วยได้!


ขอบคุณสำหรับสิ่งนี้ แต่ฉันคิดว่าฉันควรคัดลอกว่าหลักมัน ลองดูคำตอบของ @birgire เพื่อเป็นตัวอย่าง
henrywright

ฟังดูดีสำหรับฉัน :)
Welcher

1

คุณสร้างปลั๊กอินใหม่และให้คำแนะนำผู้ใช้ของคุณเพื่อโยกย้ายไปเป็นปลั๊กอินปัจจุบันคือ EOL

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


ผู้ใช้ของฉันจะได้รับผลกระทบโดยสิ้นเชิงหากปลั๊กอินอื่นมีฟังก์ชั่นที่มีชื่อเหมือนกัน (และไม่ได้ใช้เนมสเปซ)
henrywright

ไม่การเปิดใช้งานปลั๊กอินจะล้มเหลวและพวกเขาจะบ่นกับคุณหรือผู้เขียนปลั๊กอินอื่น ๆ เวลาหยุดชะงักทั้งหมดประมาณศูนย์ หากพวกเขาต้องการทั้งสองปลั๊กอินอัพเกรดเป็นใหม่ควรใช้เวลาไม่เกิน 15 นาทีโดยไม่มีการหยุดชะงักในการทำงานของเว็บไซต์ สิ่งที่คุณต้องการคือผู้ใช้ของคุณจะอัพเกรดและพบว่าฟังก์ชันบางอย่างไม่ทำงานอีกต่อไปโดยไม่แจ้งให้ทราบล่วงหน้า ใช้เวลาในการแก้ไข? คุณคิดว่าพวกเขามีการสำรองข้อมูลทั้งหมดและสามารถแก้ไขได้หรือไม่
Mark Kaplun

เมื่อคุณสร้าง API คุณต้องให้การสนับสนุนตลอดไปหรืออย่างน้อยก็จนกว่ามันจะไม่เกี่ยวข้องทั้งหมดตัวอย่างเช่น wordpress ไม่ได้ลบ API ที่เลิกใช้แล้วจริง ๆ ตั้งแต่ 3.4 และการเพิ่มการแจ้งเตือนจะไม่ทำให้คุณดี
Mark Kaplun

1
+1 เพราะฉันเคารพความคิดเห็นของคุณและสิ่งที่ฉันชอบเกี่ยวกับเว็บไซต์นี้คือมุมมองแนวทางและวิธีการแก้ไขปัญหาที่แตกต่างกันเพราะโดยปกติแล้วจะมีขนาดไม่เหมาะกับทุกคน
Birgire

1

ฉันอยากจะแนะนำสิ่งที่ชอบ:

/**
 * @deprecated Please use good_function_name() instead
 * @since x.y.z Marked deprecated in favor of good_function_name()
 * @see good_function_name()
 */
function bad_function_name() {
    trigger_error(
        'The ' . __FUNCTION__ . ' function is deprecated. ' .
        'Please use good_function_name() instead.',
        defined( 'E_USER_DEPRECATED' ) ? E_USER_DEPRECATED : E_USER_WARNING
    );

    return good_function_name();
}

สิ่งนี้มีผลต่อการแสดงคำเตือนการคัดค้านในบันทึกพร้อมกับการติดตามสแต็ก โดยปกติจะใช้งานได้ต่อเมื่อเปิดใช้งานการบันทึกใน WordPress

ผู้ประกอบการที่ประกอบไปด้วยมีเพราะ E_USER_DEPRECATED คงที่มีการแนะนำใน PHP 5.3.0 เท่านั้น ในรุ่นเก่าเราสามารถถอยกลับไปเตือนผู้ใช้อย่างง่ายแทน

จากคู่มือ PHP เกี่ยวกับค่าคงที่ข้อผิดพลาด :

E_DEPRECATEDประกาศขณะใช้งาน เปิดใช้งานสิ่งนี้เพื่อรับการเตือนเกี่ยวกับรหัสที่จะไม่ทำงานในรุ่นอนาคต

เหตุผลที่ฉันไม่ชอบใช้_doing_it_wrongหรือ__deprecated_functionก็คือฟังก์ชั่นเหล่านี้มีไว้สำหรับ WordPress หลักเท่านั้น จากการอ้างอิงรหัสในฟังก์ชั่นเหล่านั้น:

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


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