Làm thế nào để loại bỏ một chức năng được sử dụng trong một plugin?


17

Một trong những chức năng tôi đang sử dụng trong plugin của mình là gây ô nhiễm phạm vi toàn cầu với một tên có thể va chạm với một chức năng khác (được sử dụng trong một plugin khác). Vì vậy, tôi đoán tôi nên từ chối nó. Nhưng làm thế nào tôi nên đi về điều đó?

function foo() {
    echo 'bar';
}

Tôi biết _deprecate_function()nhưng sẽ rất biết ơn về một ví dụ hiển thị tất cả các bước tôi nên thực hiện để xóa chức năng khỏi lõi của plugin.

Tham chiếu: https://developer.wordpress.org/reference/fifts/_deprecated_feft/


Câu hỏi hay, nhưng có lẽ đã đến lúc đặt tên cho plugin của bạn? Bạn vẫn có thể gọi không gian tên mới từ chức năng không dùng nữa của mình ...
brianlmerritt

Không gian tên là một tùy chọn tôi muốn khám phá nhưng chưa hoàn toàn quyết định nếu tôi bỏ hỗ trợ cho PHP 5.2 chưa.
henrywright

Tải thay thế không dùng nữa nếu phiên bản php quá thấp nhưng không gian tên có thể cung cấp cho bạn đường dẫn chuyển tiếp. Thông điệp không được chấp nhận của bạn sau đó có thể là "nhà cung cấp dịch vụ lưu trữ của bạn không hỗ trợ PHP 5.3+ blah blah, v.v."
brianlmerritt

Câu trả lời:


11

Ngoài câu trả lời của @Welcher:

Có một số ví dụ " nghĩa địa " tốt trong lõi, trong đó "các chức năng sẽ chết ".

Bạn có thể sử dụng chúng làm hướng dẫn, ví dụ liên quan đến tài liệu.

Dưới đây là một ví dụ cho permalink_link()dướiwp-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();
}

Đây là tài liệu nội tuyến cho _deprecated_functionhàm giải thích các đối số đầu vào:

/**
 * 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
Cảm ơn vì điều đó. Tôi không nghĩ sẽ nhìn vào cách tiếp cận của cốt lõi! Vì vậy, tôi cho rằng đây là những bước tôi cần phải thực hiện? 1) xóa tất cả nội dung gốc khỏi chức năng của tôi 2) thêm một cuộc gọi đến _deprecated_function()3) thêm một cuộc gọi vào chức năng mới của tôi để thay thế cuộc gọi cũ
henrywright

1
Điều này nghe có vẻ như là một vấn đề hai mặt được thảo luận ở đây - sự phản đối và có thể xảy ra xung đột tên. Tôi chỉ giải quyết phần đầu tiên ở đây theo tiêu đề của câu hỏi.
bạch dương

1
@MarkKaplun Tôi đồng ý rằng có 2 vấn đề đang diễn ra. Câu hỏi là làm thế nào để từ chối chức năng và đó là câu trả lời của tôi dựa trên điều gì. Thông báo __doing_it_wrong dành cho các nhà phát triển đang gọi phương thức này trong các chủ đề của họ, v.v. để cho phép họ phản ứng với các thay đổi trong API thay vì chỉ sàng lọc trang web. Log Deprecated Notices là một plugin dev tuyệt vời cho phép bạn cập nhật các thay đổi cốt lõi và cũng sẽ giúp ích trong trường hợp này.
Welcher

1
@MarkKaplun Tôi thấy quan điểm của bạn. Tuy nhiên, tôi sẽ lập luận rằng một phần của sự phản đối là duy trì khả năng tương thích ngược cho đến khi mục bị xóa khỏi API. Điểm của thông báo (bất kể phương thức nào được sử dụng để tạo ra nó) là thông báo cho các nhà phát triển sử dụng phương thức mà nó sẽ bị xóa và cho họ thời gian để hành động tương ứng. Cách để loại bỏ một cái gì đó là làm nổi bật và xóa nó, cách thích hợp là cung cấp cho người dùng đầu tiên :)
Welcher

2
@MarkKaplun Tôi không chắc chắn những gì bạn đang tranh cãi (hoặc cho?). Câu hỏi đặt ra là làm thế nào để loại bỏ một phương thức và rõ ràng bởi thực tế là OP nói rằng "plugin của tôi" biết sự phản đối có nghĩa là anh ta là một nhà phát triển. Người dùng tưởng tượng mà bạn đang nói không liên quan gì đến câu hỏi cụ thể này. Nếu bạn lo lắng về việc nhận được một triệu thông báo trong nhật ký, các phương thức được đề cập chỉ xuất ra nếu WP_DEBUG được bật và theo quan điểm của bạn, điều đó sẽ không được kích hoạt bởi những người không phải là nhà phát triển và chắc chắn không được sản xuất. Tôi sẽ tôn trọng chỉ đồng ý không đồng ý di chuyển trên :)
Welcher

7

Khấu hao không phải lúc nào cũng được loại bỏ bằng nhau, điều đó thường có nghĩa là mục được đánh dấu để xóa SỰ KIỆN khỏi API. Đây có phải là một phương thức sẽ được gọi bên ngoài - như trong các plugin hoặc nhà phát triển khác không? Nếu phương thức này chỉ được sử dụng bởi plugin trong nội bộ, bạn có thể loại bỏ một cách an toàn thay thế nó bằng một chức năng tên tốt hơn.

Nếu không, tôi sẽ tạo ra hàm được đặt tên tốt hơn và gọi một hàm được gọi xấu bằng một __doing_it_wrongcuộc gọi - đọc về nó trong bộ Điều này sẽ cho các nhà phát triển khác có thời gian để cập nhật các tham chiếu của họ đến phương thức và bạn có thể gỡ bỏ phương thức một cách an toàn một phiên bản mới hơn.

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();
}

Hi vọng điêu nay co ich!


Cảm ơn vì điều này nhưng tôi nghĩ tôi nên sao chép cốt lõi của nó. Hãy xem câu trả lời của @birgire để biết ví dụ
henrywright

Nghe có vẻ tốt với tôi :)
Welcher

1

Bạn tạo một plugin mới và khuyên người dùng của bạn chuyển sang plugin đó vì plugin hiện tại là EOL.

Không có gì khó chịu hơn các tác giả plugin và chủ đề thay đổi API công khai của họ và cố gắng coi nó là "chỉ là một bản nâng cấp nhỏ". Không có lý do để phá vỡ các trang web vì một vấn đề người dùng của bạn thực sự không bị ảnh hưởng.


Người dùng của tôi sẽ hoàn toàn bị ảnh hưởng bởi điều này nếu một plugin khác có chức năng có cùng tên (và không sử dụng không gian tên).
henrywright

Không, kích hoạt plugin sẽ thất bại và họ sẽ khiếu nại với bạn hoặc tác giả của plugin khác. Tổng thời gian gián đoạn khoảng không. Nếu họ cần cả hai plugin nâng cấp lên một plugin mới thì sẽ không mất quá 15 phút mà không làm gián đoạn chức năng của trang web. Điều bạn muốn là một số người dùng của bạn sẽ nâng cấp và phát hiện ra rằng một số chức năng không còn hoạt động nữa mà không có bất kỳ thông báo nào. Thời gian khắc phục? Bạn có nghĩ rằng họ có một bản sao lưu và có thể sửa nó không?
Đánh dấu Kaplun

Khi bạn đã tạo một API, bạn phải tiếp tục hỗ trợ nó mãi mãi hoặc ít nhất là cho đến khi nó hoàn toàn không phù hợp, ví dụ như wordpress không thực sự xóa bất kỳ API nào không dùng nữa từ 3,4 và chỉ cần thêm một thông báo sẽ không giúp ích gì cho bạn.
Đánh dấu Kaplun

1
+1 vì tôi tôn trọng ý kiến ​​của bạn và những gì tôi thích về trang web này là các quan điểm, cách tiếp cận và giải pháp khác nhau cho các vấn đề, bởi vì thông thường không có một kích thước phù hợp với tất cả.
bạch dương

1

Tôi sẽ đề nghị một cái gì đó như:

/**
 * @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();
}

Điều này có tác dụng hiển thị cảnh báo khấu hao trong nhật ký cùng với dấu vết ngăn xếp. Đương nhiên, điều này sẽ chỉ hoạt động nếu đăng nhập được kích hoạt trong WordPress.

Toán tử ternary ở đó vì hằng số E_USER_DEPRECATED chỉ được giới thiệu trong PHP 5.3.0. Trong các phiên bản cũ hơn, chúng ta có thể quay lại cảnh báo người dùng đơn giản thay thế.

Từ hướng dẫn PHP về hằng số lỗi :

E_DEPRECATED Thông báo thời gian chạy. Cho phép điều này để nhận cảnh báo về mã sẽ không hoạt động trong các phiên bản trong tương lai.

Lý do tôi không thích sử dụng _doing_it_wrong hoặc __deprecated_function là các chức năng này chỉ dành cho lõi WordPress. Từ tham chiếu mã trên các chức năng đó:

Quyền truy cập của chức năng này được đánh dấu là riêng tư. Điều này có nghĩa là nó không dành cho các nhà phát triển plugin hoặc chủ đề sử dụng, chỉ trong các chức năng cốt lõi khác. Nó được liệt kê ở đây cho đầy đủ.


1
Đó là một điểm hoàn toàn hợp lệ +1 - mặc dù chúng ta có thể thấy các plugin như Wooc Commerce sử dụng cả hai chức năng . bất kể.
bạch dương
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.