プラグインで使用される関数を廃止する方法は?


17

プラグインで使用している関数の1つは、(別のプラグインで使用されている)別の関数と衝突する可能性のある名前でグローバルスコープを汚染することです。だから、私はそれを廃止すべきだと思います。しかし、それについてどうすればよいですか?

function foo() {
    echo 'bar';
}

私は承知のだ_deprecate_function()が、私は私のプラグインのコアから機能を除去するために取るべきすべての手順を示す一例に感謝することでしょう。

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


良い質問ですが、プラグインの名前空間を設定する時間になりそうですか?あなたはまだ...あなたの非推奨機能から新しい名前空間を呼び出すことができます
brianlmerritt

Namespacingは私が探求したいオプションですが、PHP 5.2のサポートをまだ廃止するかどうかはまだ決定していません。
ヘンリーライト

PHPバージョンが低すぎる場合に非推奨の代替をロードしますが、それ以外の場合は名前空間を使用すると移行パスが提供される場合があります。非推奨のメッセージは、「ホスティングプロバイダーがPHP 5.3以降をサポートしていない」などの場合があります
brianlmerritt

回答:


11

@Welcherによる答えに加えて:

コアにはいくつかの良い「墓地」の例があり、そこでは「機能が消滅する」。

これらは、ドキュメントなどに関するガイドラインとして使用できます。

ここに1つのそのような例だ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
これは、ここで説明する両面の問題-非推奨と名前の衝突の可能性のように聞こえます。ここでは、質問のタイトルに従って最初の部分のみを取り上げました。
バージール

1
@MarkKaplun 2つの問題が進行していることに同意します。問題は、機能を非推奨にする方法であり、それが私の答えに基づいていました。__doing_it_wrong通知は、テーマなどでこのメソッドを呼び出している開発者向けで、サイトをホワイトスクリーンするだけでなく、APIの変更に対応できるようにします。Log Deprecated Noticesは優れた開発プラグインであり、コアの変更を最新の状態に保つことができ、この場合にも役立ちます。
ウェルチャー

1
@MarkKaplunあなたの主張がわかります。ただし、非推奨の一部は、アイテムがAPIから削除されるまで下位互換性を維持することだと主張します。通知の要点(どのメソッドを使用して生成するかに関係なく)は、メソッドを使用する開発者に、メソッドが削除されることを通知し、それに応じて行動する時間を与えることです。何かを非推奨にする方法は、それを強調表示して削除することです。適切な方法は、最初にユーザーに
注意を促すことです

2
@MarkKaplunあなたが何を主張しているのか分かりません(または?)。問題はメソッドを非推奨にする方法であり、OPが「私のプラグイン」は非推奨が開発者であることを意味することを知っていると言う事実によって明らかです。あなたが話している架空のユーザーは、この特定の質問とは何の関係もありません。ログで100万通の通知を受け取るのが心配な場合、問題のメソッドはWP_DEBUGが有効になっている場合にのみ出力されます。私は敬意を表して、次の動きに同意しないことに同意します:)
ウェルチャー

7

非推奨は必ずしも削除されることと同じではありません。通常、アイテムはAPIからのEVENTUAL削除のマークが付けられていることを意味します。これは、他のプラグインや開発者のように、外部から呼び出されるメソッドですか?このメソッドがプラグインによって内部でのみ使用されている場合は、おそらく安全に削除して、より良い名前の関数に置き換えてください。

そうでない場合、私はより良い名前の関数を作成し、コールでそれを呼び出す名前の悪い名前を持ってい__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

私にはいいですね:)
ウェルチャー

1

新しいプラグインを作成し、現在のプラグインがEOLであるため、それに移行するようユーザーにアドバイスします。

プラグインやテーマの作成者が公開APIを変更し、それを「もう1つの小さなアップグレード」として扱うことほど面倒なことはありません。ユーザーが実際に影響を受けていない問題のために、サイトを破壊する理由はありません。


別のプラグインがまったく同じ名前の関数を持っている場合(そして名前空間を使用していない場合)、私のユーザーはこれにより完全に影響を受けます。
ヘンリーライト

いいえ、プラグインのアクティベーションは失敗し、それらはあなたまたは他のプラグインの作者に文句を言います。合計中断時間は約0です。両方のプラグインが必要な場合、新しいプラグインへのアップグレードには、サイトの機能を中断することなく、15分しかかかりません。必要なのは、一部のユーザーがアップグレードし、一部の機能が予告なく機能しなくなっていることを発見することです。修正する時間ですか?バックアップがあり、それを修正できると思いますか?
マーク・Kaplun

APIを作成したら、それを永久に、または少なくとも完全に無関係になるまでサポートし続ける必要があります。たとえば、wordpressは、3.4から廃止されたAPIを実際に削除しませんでした。
マークカプルン

1
+1私はあなたの意見を尊重し、このサイトについて私が楽しんでいるのは、問題に対するさまざまな見解、アプローチ、解決策だからです。
バージール

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などのプラグインは両方の 機能を使用していることがわかります。関係なく。
バージール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.