注:この答えは、@ scribuと@kaiserの間の議論を容易にするためにここにあります。Mods:削除しないでください。ユーザー/読者:投票しないでください。ディスカッションをフォローしたい場合は、リビジョン/編集ログを見てください。ディスカッションに参加したい場合は、回答を編集してください。ディスカッションに結果がある場合は、そのようにマークされます。ありがとうございました。
シナリオ
プラグインの依存関係が存在する可能性のある、異なる重み付けの異なるシナリオもあります。(例は架空のものにすぎません)。「(親)プラグイン」という単語は、親の観点から「テーマ」と交換できます。
- (難しい)機能を拡張するか、既存のプラグインの表示(および類似のもの)を変更するだけで、親なしでは存在できない子プラグイン。例: BuddyPress»BuddyPress-FunkyCommentDisplay
- (通常)子プラグインがアクティブ化されたときに拡張機能を持つプラグイン。例: jQueryAttachmentCarousel»jQuerySlideDeck
- (ソフト)機能を追加するだけのプラグイン。例: DisneyWonderlandTheme»MickeysSocialLinks
以下では、「その他」のプラグインを更新したときにチェックが機能しなくなったときに何が起こるかをスケッチしてみます。
- 広告1)BuddyPressを有効にしないとプラグインは存在しません»スタッフは完全に壊れています。
- 広告2)プラグインは、カルーセルからSlideDeckに切り替えるオプションを提供できませんでした»有線ディスプレイ(スタイルがSlideDeckに変更されていると思います)。
- 広告3)MickeysSocialLinksが表示されなくなります。
小切手
プラグインがアクティブであるかどうかを知りたい場合、チェックする可能性のある3つの可能性があります。
- A.フォルダは存在しますか?
- B.メインファイル-オプション
'active_plugins'
-は存在しますか?
- C.特定の機能はありますか?
私の内部リンクチェッカープラグインを例に取ると、パブリックAPIを提供せず、拡張することを意図していないので、(作成者として)内部関数の名前をオンデマンドで変更しない理由はありません。 。したがって、誰かがこのプラグインを便乗させようとすると、アップデート時に(機能とバンドルの厳しさに応じて)単純に問題が発生します。ファイル名についても同様です。ファイル名を変更しないという本当の理由はありません(更新時にプラグインが非アクティブになることを除けば)。フォルダー名を変更できないのは、更新チェックと通知がファイル名に対して実行されることだけです-公式リポジトリでホストされている場合。
したがって、(親)プラグインの最も弱い(変更が容易)から最も(変更に反対する)までの部分は次のようになります。
関数»メインファイル名»フォルダ
関数チェックは使用するよりも脆弱ではないと言ったときis_plugin_active()
、問題の関数はプラグインの作成者が明示的に推奨しているものであると想定しました。この最終的な例はwp_pagenavi()
、WP-PageNaviプラグインによって提供されるテンプレートタグです。
依存関係を定義することの難しさは、ファイル名を含まないプラグインを一意に識別する標準的な方法がないことです。
主題についてのより多くの考え:
http://wordpress.org/support/topic/plugin-plugin-dependencies-unreliable-plugin-namingidentifying-scheme
これまでのところ、3つの点で要約できます。
- 少し異なるトピックについて話しました
- 私はトピックが私が思ったものを回避するための防弾方法がないことに同意します
- 質問の理解から、あなたは行くための有効な方法を提供しました
私が考えることができる(これまでのところ)最も賢い方法は、一部の(はるかに少ない)プラグインですでに見たものです。
// inside the plugin file:
add_action( 'plugin_custom_hook', 'plugin_trigger' );
// inside some template:
do_action( 'plugin_custom_hook' );
詳細についてあまり考えずに、通知を「すべて」のフィルターのチェックにフックし、フックがオンのときにトリガーされた場合は現在のフィルターの内部をチェックすることができると思いますshutdown
...?
フックを使用すると、「通常」および「弱い」依存関係にうまく機能します。唯一の欠点は、あなたがまだ使用する必要があるだろうということですfunction_exists()
かis_plugin_active()
あなたは依存関係が満たされない場合停止する場合。そのために「すべて」のフィルターを使用すると、IMOが高すぎます。
@scibuこれは「あなたの」トピックをターゲットにしています。(私はすでに私の話をやめました)。:)
したがって、基本的に、依存関係が必要であり、優れた作者がいる場合は、テンプレートタグの代わりにフックを提供できます。プラグインは、フックが存在する場合にのみフックするか、単に何もしないためです。また、プラグインが存在しない場合でも、エラーは発生しません。
難しい部分(またはQの詳細)は次のとおりです。依存関係についてユーザーに通知する管理者通知を作成するには、「»DisneyWonderLinks«をインストールする必要があります」というをチェックしarray_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] )
ます。これが機能するかどうかはわかりませんが、アレイは両方の(public / admin)側からアクセスできる必要があります。
それはうまくいきません。コールバックがフックに登録されているからといって、期待したときにフックがトリガーされるわけではありません。一種の作業となるのは、前述の「シャットダウン」フックを使用することだけです。
add_action( 'shutdown', function() {
if ( !did_action( 'template_tag_like_hook' ) )
echo 'Problem.';
} );
もちろん、これは</html>
タグの後の最下部のフロントエンドに印刷されます(テンプレートタグが通常使用される場所であるため)、あまり役に立ちません。
メッセージをwp_optionsに保存してから管理領域に表示することもできますが、無効化、キャッシュプラグインなど、まったく新しいワームの缶が開きます。
function_exists
通常のユーザーは、別のプラグインが依存するプラグインをインストールしていないというメッセージを受け取るだけです。問題は、ユーザーが実際にプラグインをインストールしていて、なぜそれが機能しないのか不思議に思うことです。ああ、私はそのためにあなたに反対投票するつもりはありません。