如何弃用插件中使用的功能?


17

我在插件中使用的功能之一是使用可能与另一个功能(在另一个插件中使用)相冲突的名称来污染全局范围。所以,我想我应该弃用它。但是我应该怎么做呢?

function foo() {
    echo 'bar';
}

我知道,_deprecate_function()但对于一个示例,该示例显示了我应采取的所有步骤,以从插件的核心中删除该功能,将不胜感激。

参考:https : //developer.wordpress.org/reference/functions/_deprecated_function/


很好的问题,但是也许是时候为您的插件命名空间了吗?您仍然可以从已弃用的函数中调用新的名称空间...
brianlmerritt 2015年

Namespacing是一个我想探索的选项,但是还不确定是否要放弃对PHP 5.2的支持。
henrywright 2015年

如果php版本太低,则加载已弃用的替代方法,但否则命名空间可能会为您提供过渡路径。然后,您已弃用的消息可能是“您的托管服务提供商不支持PHP 5.3+等等等等”
brianlmerritt 2015年

Answers:


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 2015年

1
@MarkKaplun我同意发生2个问题。问题是如何弃用该函数,这就是我的答案所基于的。__doing_it_wrong通知适用于在主题等中调用此方法的开发人员,以使他们能够对API中的更改做出反应,而不仅仅是对网站进行白屏处理。Log Deprecated Notices是一个很棒的dev插件,它使您可以了解核心更改的最新信息,在这种情况下也将有所帮助。
Welcher

1
@MarkKaplun我明白你的意思了。但是,我认为不赞成使用的部分是保持向后兼容性,直到将该项目从API中删除为止。通知的重点(无论使用哪种方法生成通知)都是要通知使用该方法的开发人员将其删除,并给予他们相应的时间采取行动。不赞成使用的方法是突出显示并删除它,正确的方法是首先让用户注意:)
Welcher 2015年

2
@MarkKaplun我不确定您要反对的是什么(还是为了什么?)。问题是如何弃用一种方法,而OP指出“我的插件”知道弃用意味着他是一名开发人员,这一点很明显。您所讨论的虚构用户与该特定问题无关。如果您担心在日志中收到一百万条通知,则仅在启用WP_DEBUG的情况下才会输出有问题的方法,并且您要指出的是,非开发人员不会启用,当然也不会在生产环境中启用。我要恭敬地同意不同意继续前进:)
Welcher 2015年

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 2015年

1

您创建了一个新插件,并建议您的用户迁移到该插件,因为当前的插件是EOL。

没有什么比让插件和主题作者更改其公共API并尝试将其视为“只是另一个小的升级”更令人讨厌的了。由于您的用户实际上没有受到影响,因此没有理由中断站点。


如果另一个插件具有完全相同的名称的功能(并且未使用名称空间),则我的用户将完全受此影响。
henrywright 2015年

否,插件激活将失败,他们将向您或其他插件的作者投诉。总中断时间约为零。如果他们确实需要两个插件都升级到一个新插件,则只需不超过15分钟,而不会中断网站的运行。您想要的是一些用户将升级,并且发现某些功能不再起作用而不会发出任何通知。该修理了吗?您认为他们完全有备份并且可以修复该备份吗?
马克·卡普伦2015年

创建API后,您必须永久或至少一直支持它,直到完全不相关为止。例如,wordpress自3.4以来并没有删除任何已弃用的API,仅添加通知并不会带来任何好处。
马克·卡普伦

1
+1是因为我尊重您的意见,而我对本网站的欣赏是对问题的不同看法,方法和解决方案,因为通常没有一个适合所有人的大小。
birgire 2015年

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 '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.