web-dev-qa-db-ja.com

クラスを個人的にプラグインにインポートする方法を教えてください。

ビジネスロジックをプレゼンテーションから切り離すために、私が作成した簡単なコントローラ/テンプレートライブラリを利用するWordpressプラグインを書きました。他のプラグインの使い方と衝突しないように、この「個人的に」プラグインにインポートする方法について(やや理論的な)問い合わせがあります。

TemplateSystemと呼ばれるライブラリは、私のgitリポジトリのプラグイン用のサブモジュールで、内部的に次のように定義されています。

<?php

// Don't define this if it's already been defined
if (!class_exists('TemplateSystem'))
{
    abstract class TemplateSystem
    {
        ...
    }
}

したがって、別のプラグインがTemplateSystemを利用する場合、再定義してエラーを作成するのではなく、ロードされたコピーが使用されます。これで問題はありませんが、TemplateSystemに後方互換性のない変更が導入されました。

だから、私は同時にロードする必要がある同じライブラリの2つのバージョンがあります。現時点では、WPによるプラグインの順序に応じて、新しいライブラリが古いプラグインを破壊するか、古いライブラリが新しいプラグインを破壊します。

それで、これは問題を解決するTemplateSystemへの1つの潜在的な変更です:

<?php

// The 'Change2' part would change with backwards incompatible changes,
// rather than just version numbers (although that would be fine tbh)
namespace TemplateSystem\Change2;

// Don't define this if it's already been defined
if (!class_exists('TemplateSystem\Change2\TemplateSystem'))
{
    abstract class TemplateSystem
    {
        ...
    }
}

私のユースケースで名前の衝突を避けるために、私はこれをすることができます:

<?php
use TemplateSystem\Change2\TemplateSystem as VersionedCommentsTemplateSystem;

class VersionedCommentsController extends VersionedCommentsTemplateSystem
{
    ...
}

それは古い(名前空間のない)バージョンと並んでうまく働きます。さて、私はテンプレートライブラリの作者であり、(公に利用可能ですが)他の誰かがそれを使っているとは思わないので、この質問は理論的であると述べました。したがって、1つの解決策はこの問題を無視することです。しかし、適切に対処する方法を知っておくといいでしょう。

2番目の可能性:名前空間がPHP 5.3を必要とすることを除いて上記の名前空間解決策はうまくいくでしょう、そして - このサイトのさまざまな答えが示すように - WPは間もなく廃止予定のバージョンから動かない。たとえコアが動いていなくても、それを無視してPHP 5.3を要求すべきですか?もちろんそれは私の仕事に基づくプラグインが古いサーバーで動作するのを妨げるでしょう。

あるいは、プラグイン(およびそれらのライブラリー)がたったの5.2.4を必要としていると思う場合、代替の修正は何ですか?私は、ライブラリ名が各プラグインのカスタム名に置き換えられるように、ちょっとした検索と置き換えを行う、バンドルされたPHPコンソールの "build"スクリプトを検討していました。したがって、TemplateSystem.phpファイルがコピーされ、そのコピーのクラス定義は内部的にVersionedCommentsTemplateSystemとして名前が変更されます(つまり、ユースケースに従って)。それはやや厄介ですが、少なくとももっと多くのインストールでうまくいくでしょう。

最後の可能性は、クラス名に変更またはバージョン番号を追加することです:

<?php

// Don't define this if it's already been defined
if (!class_exists('TemplateSystem2'))
{
    abstract class TemplateSystem2
    {
        ...
    }
}

それは5.2.4+でうまくいくでしょう、しかし私の最も好まれない解決策です。私の内なる純粋主義者はクラス名の腐敗を懇願します!

経験豊富なプラグイン作成者はどのようなアプローチを取りますか?

5
halfer

名前空間 を使用しますが、 サーバー側でPHP version を確認し、要件が満たされていない場合は有用なエラーメッセージでプラグインを無効にします。 t会った。

公式統計 を見ると、古いWordPressバージョンでまだいくつのインストールが実行されているかがわかります。しかし、ほとんどすべての新しいプラグインは最新のWordPressバージョンを必要とし、誰もそれについて不満を言いません。放棄された、あるいは管理が不十分なインストールがたくさんあると思います。彼らはおそらくあなたのプラグインをとにかく使わないでしょう。

そのため、最新の状態で、まだPHP 5.2にインストールされている比較的少数のインストールが残ります。彼らはアップグレードすることができます。今日では、すべてのWebホストがこれを提供していますが、そうでなければ Symfony や他の一般的なスクリプトを実行することはできませんでした。

他のオプションは、ライブラリを別のプラグインに移動し、そのライブラリを最初にインストールすることを要求することです。次に、 library_loaded にフックして、専用プラグインのコードを起動します。

2
fuxia