3

当用户的 PHP 版本不足时,我使用下面的代码来停用插件本身。一个问题是出现黄色消息框,说明该插件已激活,尽管此功能已成功拒绝该插件。那么有没有办法不显示黄色消息?

function Plugin_Requirements() {
    global $wp_version;
    $plugin = plugin_basename( __FILE__ );
    $plugin_data = get_plugin_data( __FILE__, false );
    $numPHPver='5.1.2';     
    $strMsg .= $plugin_data['Name'] . ': ' . __('requires PHP')  . ' ' . $numPHPver . __(' or higher. Your PHP version is : ') . phpversion() . __('. Deactivating the plugin.') . '<br />';

    if ( version_compare(phpversion(), $numPHPver, "<" ) ) {
        echo '<div class="error"><p>' . $strMsg . '</p></div>';
        deactivate_plugins( $plugin );
    }   
}
add_action( 'admin_init', 'Plugin_Requirements' );
4

7 回答 7

7

您可以取消设置$_GET触发消息的变量:

if ( version_compare(phpversion(), $numPHPver, "<" ) ) {
    echo '<div class="error"><p>' . $strMsg . '</p></div>';
    deactivate_plugins( $plugin );
    unset($_GET['activate']);
}

我认为更好的方法是不允许您的插件被激活,方法是退出(或抛出错误)它的激活钩子。Wordpress 将显示一条错误消息,说明由于致命错误而无法激活插件,但这在这里似乎很合适。

function my_activation_hook() {
    $required_php_version = '5.1.2';

    if (version_compare(PHP_VERSION, $required_php_version, '<')) { 
        $plugin_data = get_plugin_data(__FILE__, false);
        $message = $plugin_data['Name'] . ' ' . __('requires PHP')  . ' ' . $required_php_version . __(' or higher. Your PHP version is ') . phpversion() . '.';
        echo "<p>{$message}</p>";
        exit;
    } 
} 
register_activation_hook(__FILE__, 'my_activation_hook');
于 2012-09-09T21:06:46.620 回答
2

做到这一点有点棘手。RichardM 的答案非常接近,但这是我发现的作品,没有显示致命错误或必须使用wp_die(). 诀窍是在检查插件的要求register_activation_hook() 后调用。如果您不这样做,那么 WordPress 会愉快地激活插件并生成“已激活插件”。在您检查您的要求之前发送消息。

我也喜欢在我的消息中使用瞬变,这样我就可以随时显示我的错误消息。当您需要与用户交流多条消息时,它会更有用。

示例代码:

<?php
/**
 * Plugin Name: My Plugin
 * Description: A sample plugin activation call without generating "Plugin activated."
 *     message if requirements aren't met.
 * Author: Slicktrick
 * Version: 1.0.0
 * Requires at least: 4.0
 */

add_action( 'admin_init', 'check_requirements_for_my_plugin' );
add_action( 'admin_notices', 'show_notices_for_my_plugin' );

function check_requirements_for_my_plugin() {
    // Check that we are using PHP 5.1.2 or greater.
    // Modify this to use whatever checks you need.
    $phpversion = '5.1.2';
    if ( version_compare(phpversion(), $phpversion, "<" ) ) {
        // deactivate and remove flag to activate plugin
        deactivate_plugins( plugin_basename( __FILE__ ) );
        if ( isset( $_GET['activate'] ) ) {
            unset( $_GET['activate'] );
        }

        // Create an error message and store it as a transient
        // Transient is set to automatically expire after 120 seconds
        // This prevents the message from lingering indefinitely
        $error_message = "PHP version $phpversion required. My Plugin was not activated.";
        set_transient( 'my_plugin_activation_error_message', $error_message, 120 );
    } else {
        // Here's the trick, we register our activation hook
        // now that we know the requirements are met!
        register_activation_hook( __FILE__, 'activate_my_plugin' );
    }
}

function show_notices_for_my_plugin() {
    // We attempt to fetch our transient that we stored earlier.
    // If the transient has expired, we'll get back a boolean false
    $message = get_transient( 'my_plugin_activation_error_message' );

    if ( ! empty( $message ) ) {
        echo "<div class='notice notice-error is-dismissible'>
            <p>$message</p>
        </div>";
    }
}

function activate_my_plugin() {
    // Add activation code here
}

// Add the rest of your plugin code here

check_requirements_for_my_plugin()函数将在每次admin_init执行时运行。虽然一旦插件被激活,这可能看起来像是一个多余的检查,但想想如果有人更改托管服务提供商或移动到不同的服务器会发生什么。新的服务器环境可能不支持您的插件,如果 WordPress 数据库被直接复制(很可能),用户最终可能会遇到各种错误和功能损坏。check_requirements_for_my_plugin()所以每次调用我们的函数是必要的。

如果您不想在插件无法激活时向用户显示任何消息(为什么要让用户对插件未激活的原因一无所知???),那么您可以删除以下内容三行代码加上整个show_notices_for_my_plugin()函数:

// at the top of the file
add_action( 'admin_notices', 'show_notices_for_my_plugin' );

// from the check_requirements_for_my_plugin() function
$error_message = "PHP version $phpversion required. My Plugin was not activated.";
set_transient( 'my_plugin_activation_error_message', $message, 120 );

参考:

  1. WordPress Codex - 管理员通知
  2. WordPress Codex - 瞬态 API

更新

根据这个答案和来自 WordPress Lead Developer 的评论,似乎更好的方法是让你的插件保持激活状态,但禁用所有功能。一旦满足要求,您就可以使用其他检查来执行您需要执行的任何安装任务。这可以通过以下示例代码轻松完成:

add_action( 'plugins_loaded', 'check_requirements_for_my_plugin' );

function check_requirements_for_my_plugin() {
    // Do whatever checking needed here
    if ( ! $requirements_met ) {
        add_action( 'admin_notices', 'show_requirements_notice_for_my_plugin' );
        return; // Exit your function
    }
    // Register all other hooks here since you know requirements are
    // met if you reach this point
    add_action( 'admin_init', 'maybe_update_my_plugin' );
}

function show_requirements_notice_for_my_plugin() {
    // I'd expand this to add a list of needed requirements
    echo '<div class="notice notice-error">'
        . "My-Plugin functionality is disabled because the requirements are not met."
        . '</div>';
}

function maybe_update_my_plugin() {
    // Check to see if update/installation tasks need to be performed
}

此方法允许您将通知保留在用户面前,以便他们对其采取行动。当他们尝试激活插件时,我的原始答案会显示一条通知,但是一旦加载新页面,通知就会消失,因为此时插件不再处于活动状态。

于 2017-02-22T18:03:19.800 回答
0
function _my_plugin_php_warning() {
    echo '<div id="message" class="error">';
    echo '  <p>My Plugin requires at least PHP 5.  Your system is running version ' . PHP_VERSION . ', which is not compatible!</p>';
    echo '</div>';
}

function deactivate_plugin_conditional() {

    if ( version_compare( PHP_VERSION, '5.2', '<' ) ) {
        $plugin = plugin_basename(__FILE__);

        if ( is_plugin_active($plugin) ) {
            deactivate_plugins($plugin);    
        }   
        add_action('admin_notices', '_my_plugin_php_warning');

    } else {
        //Load classes
    }
}

add_action( 'admin_init', 'deactivate_plugin_conditional' );

这只会在没有发生错误时激活插件。如果插件已经激活,它将被禁用。希望这对你有用。请让我知道结果如何。

于 2012-09-04T11:20:34.217 回答
0

get_plugin_data()

该功能仅适用于 WordPress 管理员,而不是使用 get_plugin_data() 您可以在插件中为插件名称和插件版本定义常量,请查看此线程 http://wordpress.org/support/topic/php-fatal-错误调用未定义函数-get_plugin_data

于 2013-07-26T05:54:21.450 回答
0

如果您根本不想显示该消息,请转到 php 页面并在页面顶部的开始 php 标记之后立即添加 error_reporting(0)。

于 2013-07-26T06:07:05.240 回答
0

我有一个类似的问题,涉及register_activation_hook()全局变量 $wp_version: 每次激活或停用我的插件时,我都会在debug.log文件中收到以下消息:

PHP 注意:未定义变量:wp_version (...)

当我将 $wp_version 替换为get_bloginfo('version')

于 2020-12-17T23:20:22.033 回答
-2

目前似乎不可能将其作为插件的一部分。

于 2012-09-24T11:15:09.103 回答