特定のWPバージョンが満たされない場合、アクティベーションプロセスでプラグインを停止し、admin_noticesアクションフックにエラーメッセージを表示する


9

特定のWPバージョン番号を満たしていない場合にアクティブ化したくないプラグインがありますが、admin_noticesアクションフックにエラーメッセージを表示します。私が調査した限りでは、以下のコードは私がこの目標を達成できる最高のものです:

$wp_version = get_bloginfo('version');
if ( $wp_version < 4.5 ) {
    add_action( 'admin_init', 'deactivate_plugin_now' );
    add_action( 'admin_notices', 'errormsg' ) );
}

public function deactivate_plugin_now() {
    if ( is_plugin_active('myplugin/myplugin.php') ) {
        deactivate_plugins('myplugin/myplugin.php');
    }
}

public function errormsg () {
    $class = 'notice notice-error';
    $message = __( 'Error you did not meet the WP minimum version', 'text-domain' );
    printf( '<div class="%1$s"><p>%2$s</p></div>', $class, $message );
}

しかし、私が割り当てたエラー通知と同時にプラグインがアクティブ化されたメッセージを受け取っているので、私はまだそれを間違っていると思います。

特定のWPバージョンが満たされない場合、アクティベーションプロセスでプラグインを停止する

プラグインのアクティブ化プロセスを適切に停止するための適切なアクションフック/フィルターは何ですか?エラーメッセージのみが表示されますか?


プレセ@CarlAlbertoは私の答えを考慮します。
prosti 2017年

回答:


6

私はこのパーティーに遅れる可能性がありますが、プラグインのアクティブ化を停止してWordPressに管理者が通知したエラーメッセージを表示させるには、エラーメッセージを出力して実行を終了します。これには、wp-cliをうまく使用できるという利点があります。

プラグインのアクティブ化に失敗しました

例:

class testPlugin() {

  ...

   static function activate() {

   //[do some stuff here]

   if ($error) {
      die('Plugin NOT activated: ' . $error);
   }

}

register_activation_hook( __FILE__, array( 'testPlugin', 'activate' ));

2

本質的に、あなたが望む方法でそれを行うことはできません。すべてのワードプレスフォームは、プロセスの完了後にリダイレクトされ、自分で出力を生成しないため、別のページリクエストでエラーメッセージが生成されます。プラグインがその時点でアクティブにならない場合、メッセージは表示されません。さらに複雑なのは、プラグインがAjaxによってアクティブ化される可能性があることです。

醜いが有効な方法は、phpエラーを生成してアクティブ化を失敗させることです。そうしないと、IIRCですべての出力が実行されるため、プラグインのアクティブ化フックで「バージョンの不一致」などを出力できます。これは、エラー出力ボックスに表示されます。アクティベーションが失敗すると表示されます。

考えるべきこと:プラグインファイルをインクルードしたり、UIをバイパスしたり、wp-cliを使用して、プラグインを強制的にアクティブ化したりすることができます。アクティベーションを失敗させたい理由によっては、アクティベーションを失敗させようとするよりも、エラーメッセージを表示する方がよい場合があります。


2

タイトルを更新したので、別の回答を提供する必要があります。以前の回答は、この回答よりもさらに簡単なので、無視しないでください。

add_action( 'admin_notices', 'my_plugin_admin_notices' );

function my_plugin_admin_notices() {
    if ( ! is_plugin_active( 'hello.php' ) && isset( $_GET['customhello'] ) ) {
        echo '<div class="error"><p>WordPress need to be at least 8.5 to activate this plugin</p></div>';
    }
}

add_action( 'activate_plugin', '_20170113_superess_activate', 10, 2 );

function _20170113_superess_activate( $plugin, $network_wide ) {
    global $wp_version;
    if ( $wp_version < 8.5 && 'hello.php' == $plugin ) {
        $redirect = self_admin_url( 'plugins.php?customhello=1' );
        wp_redirect( $redirect );
        exit;
    }
}

ここに画像の説明を入力してください

プラグインをアクティブにしようとすると、plugins.phpファイルを操作することに注意してください。そこには、実行できるアクションの大きなスイッチがあります。

$_GET['error']現時点でエラーが設定されている場合は、事前定義されたエラーメッセージのみが表示されます。独自のカスタムメッセージを作成することはできません。これが私があなたにこのような解決策を提案した理由です。

ここに画像の説明を入力してください

プラグインがいくつかの要件を満たしていない場合は、管理者がWordPressコアに通知するときにカスタムメッセージを提案できます。


3
これは動作しません。プラグインがアクティブでない場合、WPはファイル内のスクリプトを実行しないため、リダイレクトURLにアクセスしても、フックされた関数admin_noticesは起動されません。
JakeParis 2017

0

WP <8.5の場合に、hello.php(Hello Dolly)を抑制するこのコードはどうでしょうか。

 add_action( 'activate_plugin', '_20170113_superess_activate' , 10, 2);

 function _20170113_superess_activate($plugin, $network_wide){
      global $wp_version;

      if ( $wp_version < 8.5 && 'hello.php' == $plugin ) {
        error_log( 'WordPress need to be at least 8.5' );      
        $args = var_export( func_get_args(), true );
        error_log( $args );
        wp_die( 'WordPress need to be at least 8.5 to activate this plugin' );
      }
 }

管理通知を作成する必要がないので、これは良いことだと思います。プラグインのインストールが中止された理由に関するフィードバックを受け取るだけです。

HelloDolly用にこのコードを追加しましたが、調整する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.