Як знецінити функцію, що використовується в плагіні?


17

Однією з функцій, які я використовую у своєму плагіні, є забруднення глобальної області застосування іменем, яке могло зіткнутися з іншою функцією (використовується в іншому плагіні). Отже, я думаю, я мав би знестирити це. Але як мені це робити?

function foo() {
    echo 'bar';
}

Я знаю, _deprecate_function()але буду вдячний за приклад, який показує всі кроки, які я повинен зробити, щоб вилучити функцію з ядра мого плагіна.

Посилання: https://developer.wordpress.org/reference/functions/_deprecated_function/


Хороше запитання, але чи не час для простору імен вашого плагіна? Ви все ще можете зателефонувати до нового простору імен зі своєї застарілої функції ...
brianlmerritt

Розміщення імен - це варіант, який я хочу вивчити, але не зовсім вирішив, чи потрібно покинути підтримку PHP 5.2.
Генрірайт

Завантаження застарілої альтернативи, якщо версія php занизька, але простір імен в іншому випадку може дати вам шлях переходу. Після цього вашим застарілим повідомленням може бути "ваш хостинг-провайдер не підтримує PHP 5.3+ бла-бла тощо"
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, а не просто білі екрани сайту. Невизначений журнал сповіщень - це чудовий плагін для розробників, який дозволяє бути в курсі змін в основному і допоможе в цьому випадку.
Вельчер

1
@MarkKaplun Я бачу вашу думку. Однак я заперечую, що частина припинення роботи полягає у підтримці зворотної сумісності, поки елемент не буде видалений з API. Суть повідомлення (незалежно від того, який метод використовується для його створення) полягає в тому, щоб повідомити розробників за допомогою методу, що воно буде видалено, і дати їм час діяти відповідно. Спосіб знецінення чогось - це виділити та видалити його, належним чином - спочатку дати користувачам голову :)
Welcher

2
@MarkKaplun Я не впевнений, про що ти сперечаєшся (чи за що?). Питання полягало в тому, як знехтувати метод, і зрозуміло, що ОП каже, що "мій плагін" знає, що депресія означає, що він розробник. Уявний користувач, про якого ви говорите, не має нічого спільного з цим конкретним питанням. Якщо ви переживаєте за отримання мільйона сповіщень у журналі, відповідні методи виводяться лише у тому випадку, якщо WP_DEBUG увімкнено, і, на ваш погляд, це не було б увімкнено не розробниками та, звичайно, не у виробництві. Я з повагою просто погоджуюся не погоджуватися на крок далі :)
Welcher

7

Видалення не завжди є рівним видаленням, зазвичай це означає, що елемент позначено як ЕКСПЕКТИВНЕ вилучення з API. Це метод, який називатиметься зовні - як у інших плагінах чи розробниках? Якщо цей метод будь-коли використовується внутрішнім плагіном, ви, ймовірно, можете спокійно видалити його, замінивши його на кращу функцію імені.

Якщо ні, то я б створив краще названу функцію і мав би погано назвати її з __doing_it_wrongвикликом - прочитайте про це в кодексі. Це дасть іншим розробникам час на оновлення своїх посилань на метод, і ви можете спокійно видалити метод у пізніша версія.

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 та намагаються трактувати це як "лише чергове оновлення". Немає причин зламати сайти через проблему, на яку насправді не впливають ваші користувачі.


Мої користувачі будуть цілком вплинути на це, якщо інший плагін має функцію з таким же ім'ям (і не використовує простори імен).
Генрірайт

Ні, активація плагіна не вдасться, і вони подадуть скаргу вам або автору іншого плагіна. Загальний час зриву близько нуля. Якщо вони потребують оновлення обох плагінів до нового, це займе не більше 15 хв без перерви у функціонуванні сайту. Що ви хочете, це те, що деякі ваші користувачі оновлять і виявлять, що деякі функції вже не працюють без будь-якого повідомлення. Час виправити? ви вважаєте, що вони взагалі мають резервну копію і можуть це виправити?
Марк Каплун

Після створення API вам доведеться підтримувати його назавжди або принаймні до тих пір, поки він абсолютно не має значення, наприклад, WordPress фактично не видалив жодного зістарелого API з 3.4, і лише додавання повідомлення не принесе вам користі.
Марк Каплун

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.