プラグインから個々の関数を呼び出すときに、php条件ステートメントを使用せずに、WPテーマでプラグインを必須にする方法は?


9

私のWordpressテーマの1つを正しく実行するには、いくつかのサードパーティのプラグインが必要です。

ほとんどの場合、私は次のような条件ステートメントを使用してサードパーティのプラグインから関数を呼び出すために使用しました

    if(function_exist('plugin_function')) {
             plugin_function() // do something
    }

私のテーマの多くのファイルで1つのプラグインを広範囲に使用する必要があると仮定します...多くのIF条件の使用を避けたい...特定の特定のプラグインをWPにインストールすることを要求する適切な方法がありますテーマをアクティブにする前に欠落している場合は?

ありがとう

回答:


7

is_plugin_active()プラグインの作成者がメインファイルの名前を変更するか、ユーザーがプラグインのディレクトリまたはメインファイルの名前を変更すると、壊れます。特定のパブリック関数が存在するかどうかを確認することをお勧めします。

プラグインの機能の一部が必要になるたびにチェックを行わなくても済むように、管理領域にメッセージを表示できます。

add_action( 'admin_notices', 'my_theme_dependencies' );

function my_theme_dependencies() {
  if( ! function_exists('plugin_function') )
    echo '<div class="error"><p>' . __( 'Warning: The theme needs Plugin X to function', 'my-theme' ) . '</p></div>';
}

別の方法は、http://tgmpluginactivation.com/のようなものを使用することです


プラグインの作成者が質問する関数名を変更した場合、function_exists通常のユーザーは、別のプラグインが依存するプラグインをインストールしていないというメッセージを受け取るだけです。問題は、ユーザーが実際プラグインをインストールしていて、なぜそれが機能しないのか不思議に思うことです。ああ、私はそのためにあなたに反対投票するつもりはありません
カイザー2012年

投票に関心がある場合は、Q自体が良いので、Q自体に賛成投票する必要があります。
カイザー2012年

プラグインの作成者が関数名を変更すると、ファイル名を変更するよりも多くのユーザーから苦情を受け取ります。
scribu 2012年

IMOの質問には対応しなかったので、私はあなたの回答に反対票を投じました。または、説明を提供せずに、私が秘密裏に投票することを望みますか?
scribu 2012年

私はコメントではなく、反対票について話していました。このトピックは議論が必要なものなので、コメント自体は問題ありません。その背後にある私の考えがコメントの長さを超えるので、私は別の答えを追加します。回答を編集するだけで、ディスカッションの結果をリビジョンに保持して、全員がフォローできるようになります。ありがとう。
カイザー2012年

1

プラグインが無効になっているときにテーマが壊れるのを防ぐわけではありませんが、「必要なテーマの管理者通知を表示する方法」プラグインに関するこの巧妙な記事を見てみます。私はプラグインを強制的にインストールするテーマのアイデアに慣れていないので、これは次善の策のようです。

別の簡単な考え:私はこれを試したことはありませんが、1つの条件に複数のフックを収容するための賢い方法を見つけられるかどうか疑問に思います。たぶん、すべての条件付き関数を別のファイルに分離し、if( function_exists( 'plugin_function' ) )返された場合にのみ必要になるかもしれませんtrue(これは不完全なチェックであることを理解した上で)。


0

プラグインページだけが必要な場合は、がありis_plugin_active()ます。外部で必要な場合は、コア関数をテーマにコピーして貼り付けてから、再利用してください。

if ( ! is_admin() )
{
/**
 * Check whether the plugin is active by checking the active_plugins list.
 *
 * @since 2.5.0
 *
 * @param string $plugin Base plugin path from plugins directory.
 * @return bool True, if in the active plugins list. False, not in the list.
 */
function is_plugin_active( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin );
}
}

条件式は、関数を二重に定義することでエラーを回避します。


それは本当に質問に答えません。それは単に次のものif(function_exist('plugin_function'))と置き換えられますif(is_plugin_active('plugin-file.php'))
scribu

0

注:この答えは、@ scribuと@kaiserの間の議論を容易にするためにここにあります。Mods:削除しないでください。ユーザー/読者:投票しないでください。ディスカッションをフォローしたい場合は、リビジョン/編集ログを見てください。ディスカッションに参加したい場合は、回答を編集してください。ディスカッションに結果がある場合は、そのようにマークされます。ありがとうございました。


シナリオ

プラグインの依存関係が存在する可能性のある、異なる重み付けの異なるシナリオもあります。(例は架空のものにすぎません)。「(親)プラグイン」という単語は、親の観点から「テーマ」と交換できます。

  1. (難しい)機能を拡張するか、既存のプラグインの表示(および類似のもの)を変更するだけで、親なしでは存在できない子プラグイン。例: BuddyPress»BuddyPress-FunkyCommentDisplay
  2. (通常)子プラグインがアクティブ化されたときに拡張機能を持つプラグイン。例: jQueryAttachmentCarousel»jQuerySlideDeck
  3. (ソフト)機能を追加するだけのプラグイン。例: 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に保存してから管理領域に表示することもできますが、無効化、キャッシュプラグインなど、まったく新しいワームの缶が開きます。


ちなみに、これはサイトの機能を使用するための、あまり一般的ではない方法です。c2.com/cgi/wikiを
scribu

はい、そうです。しかし、後の読者からそれを隠すことなく、どうやって議論を続けることができるのか私には分かりませんでした。
カイザー

質問を投稿することでかなりの議論が生まれたとは思いません:)しかし、それは確かに興味深いものです。アドバイスを提供し、思慮深い議論を提供してくれたあなたの努力と時間の両方に感謝します。TGM Activationクラスを使用するというscribu(その多くの1つ)からのアドバイスは、少なくとも単なる実用的な観点からは、私の答えに対する解決策を提供できると思います。ただし、提案されている他の方法も特定のシナリオで意味があり、読むのがとても興味深いので、私はまだ全体の議論に目を光らせています。
unfulvio 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.