web-dev-qa-db-ja.com

OOP:警告を表示してプラグインを無効にします PHP バージョンが5.4未満

ユーザがOOPバージョンが5.4未満の場合は、PHPコードスタイルを使用して、ユーザに通知を表示し、プラグインを無効にします。

非OOPを使ってプラグインを作成するとき、コードはうまく働きます。ユーザーに警告を表示してプラグインを無効にし、ユーザーがプラグインを有効にできないようにします。

作業コードは以下のとおりです。

非OOP

// check for required php version and deactivate the plugin if php version is less.
 if ( version_compare( PHP_VERSION, '5.4', '<' )) {
add_action( 'admin_notices', 'show_notice', 100 );
function show_notice() { ?>
    <div class="error"> <p>
            <?php
            echo 'MyPluginName requires minimum PHP 5.4 to function properly. Please upgrade PHP version. The Plugin has been auto-deactivated.. You have PHP version '.PHP_VERSION;
            ?>
        </p></div>
    <?php
    if ( isset( $_GET['activate'] ) ) {
        unset( $_GET['activate'] );
    }
}

// deactivate the plugin because required php version is less.
add_action( 'admin_init', 'MyPluginName_deactivate_self' );
function MyPluginName_deactivate_self() {
    deactivate_plugins(plugin_basename( __FILE__ ) );
}
return;
}

ただし、 オブジェクト指向プログラミング を使用してプラグインを開発する場合、このコードは機能しません。私は以下を試しました:

試み#1

// check for required php version and deactivate the plugin if php version is less.
 if ( version_compare( PHP_VERSION, '5.4', '<' )) {
add_action( 'admin_notices', 'show_notice', 100 );
function show_notice() { ?>
    <div class="error"> <p>
            <?php
            echo 'MyPluginName requires minimum PHP 5.4 to function properly. Please upgrade PHP version. The Plugin has been auto-deactivated.. You have PHP version '.PHP_VERSION;
            ?>
        </p></div>
    <?php
    if ( isset( $_GET['activate'] ) ) {
        unset( $_GET['activate'] );
    }
}

// deactivate the plugin because required php version is less.
add_action( 'admin_init', 'MyPluginName_deactivate_self' );
function MyPluginName_deactivate_self() {
    deactivate_plugins(plugin_basename( __FILE__ ) );
}
return;
}


if ( ! class_exists('MyPluginClass') ) :
class MyPluginClass {
function __construct( ){
        //enqueue scripts/styles only for front-end
        add_action('template_redirect', [$this, 'user_enqueue_scripts']);
        //enqueue scripts and style only for admin panel
        add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );

        }
}

endif;
$MyPlugin = new MyPluginClass();

試み#2

if ( ! class_exists('MyPluginClass') ) :
    class MyPluginClass {
        function __construct( ){}

        public function check_php_version (){
            // check for required php version and deactivate the plugin if php version is less.
            if ( version_compare( PHP_VERSION, '5.4', '<' )) {
                add_action( 'admin_notices', 'show_notice', 100 );
                function show_notice() { ?>
                    <div class="error"> <p>
                            <?php
                            echo 'MyPluginName requires minimum PHP 5.4 to function properly. Please upgrade PHP version. The Plugin has been auto-deactivated.. You have PHP version '.PHP_VERSION;
                            ?>
                        </p></div>
                    <?php
                    if ( isset( $_GET['activate'] ) ) {
                        unset( $_GET['activate'] );
                    }
                }

                // deactivate the plugin because required php version is less.
                add_action( 'admin_init', 'MyPluginName_deactivate_self' );
                function MyPluginName_deactivate_self() {
                    deactivate_plugins(plugin_basename( __FILE__ ) );
                }
                return;
            }

        }

        public function init() {
            //enqueue scripts/styles only for front-end
            add_action('template_redirect', [$this, 'user_enqueue_scripts']);
            //enqueue scripts and style only for admin panel
            add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
        }

    }

endif;
$MyPlugin = new MyPluginClass();
$MyPlugin->check_php_version(); // show warning if php version is less than 5.4 and deactivate the plugin
$MyPlugin->init();// initialize the plugin.

何が悪いのか教えてください。

2
Kamal Ahmed

これが、OOPを使ってプラグインを作成するときに使用する必要最低限​​のテンプレートです。お好みに合わせて変更してください。

テンプレート

if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

if ( !class_exists( 'MyPluginName' ) ) {

    class MyPluginName {

        public function __construct() { // Call your actions/filters here
            add_action( 'tag', array( $this, 'plgn_abbr_function' ), 10, 1 );
        }

        // Begin functions here
        public function plgn_abbr_function() {
            # Code here...
        }
    }
}

if ( class_exists( 'MyPluginName' ) ) { // Instantiate the plugin class
    global $plgn_abbr;
    $plgn_abbr = new MyPluginName();
}

私はすぐにあなたの試みを通してスキミングから気づいたいくつかのこと:

  1. あなたはあなたのadd_actions__construct()の下に呼び出し、あなたの関数をそれの外側に置くことを望むでしょう、しかしあなたはそれのレイアウトも変える必要があるでしょう。
  2. add_actionのレイアウトを更新する必要があります

    add_action( 'admin_notices', 'show_notice', 100 );

    この構造体はclassを利用するときはうまくいきません。

    add_action( 'admin_notices', array( $this, 'show_notice' ), 100 );

  3. 以下のように、すべての関数の前にpublicを追加する必要があります。

    public function your_code()

溶液

これは私が上で与えたテンプレートを利用するあなたのコードへの更新です、それはテストされて、そして私の側で働きます:

if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

if ( !class_exists( 'MyPluginName' ) ) {

    class MyPluginName {

        public function __construct() {
            // check for required php version and deactivate the plugin if php version is less.
             if ( version_compare( PHP_VERSION, '5.4', '<' ) ) {
                add_action( 'admin_notices', array( $this, 'show_notice' ), 100 );
                add_action( 'admin_init', array( $this, 'MyPluginName_deactivate_self' ) );
                return;
            }
        }

        public function show_notice() {
            ?>
            <div class="error">
                <p><?php echo 'MyPluginName requires minimum PHP 5.4 to function properly. Please upgrade PHP version. The Plugin has been auto-deactivated.. You have PHP version '.PHP_VERSION; ?></p>
            </div>
            <?php
            if ( isset( $_GET['activate'] ) ) {
                unset( $_GET['activate'] );
            }
        }
        public function MyPluginName_deactivate_self() {
            deactivate_plugins( plugin_basename( __FILE__ ) );
        }
    }
}

if ( class_exists( 'MyPluginName' ) ) { // Instantiate the plugin class
    global $plgn_abbr;
    $plgn_abbr = new MyPluginName();
}