当用户的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' );
答案 0 :(得分:2)
正确地做到这一点有点棘手。 RichardM的答案非常接近,但是我发现这些作品没有显示致命错误或必须使用wp_die()
。诀窍是在检查了插件的要求之后调用{/ 1}} 。如果你不这样做,那么WordPress会愉快地激活插件并生成“插件激活”。在检查您的要求之前留言。
我也喜欢为我的消息使用瞬态,所以我可以随时显示我的错误消息。当您有多条消息需要与用户沟通时,它会更有用。
示例代码:
register_activation_hook()
<?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()
时运行。虽然这可能看起来像插件激活后的冗余检查,但请考虑如果有人更改托管服务提供商或移动到其他服务器可能会发生什么。新服务器环境可能不支持您的插件,如果直接复制WordPress数据库(很可能),用户可能会遇到各种错误和功能损坏。因此,每次调用我们的admin_init
函数都是必要的恶。
如果您不希望在插件无法激活时向用户显示任何消息(为什么您希望让用户不知道插件未激活的原因??? ),然后你可以删除以下三行代码加上整个check_requirements_for_my_plugin()
函数:
show_notices_for_my_plugin()
参考文献:
基于此answer和来自WordPress首席开发人员的comment,似乎更好的选择是让您的插件保持激活但禁用所有功能。然后,您可以在满足要求后使用其他检查来执行您需要执行的任何安装任务。使用以下示例代码可以轻松完成此操作:
// 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 :(得分: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' );
这只会在没有错误发生时激活插件。如果插件已经激活,它将被禁用。希望这适合你。请让我知道结果是什么。
答案 2 :(得分:0)
函数只能在WordPress管理员中运行,而不是使用get_plugin_data()你可以在你的插件中为插件名和插件版本定义常量,看一下这个帖子 http://wordpress.org/support/topic/php-fatal-error-call-to-undefined-function-get_plugin_data
答案 3 :(得分:0)
如果您根本不希望显示该消息,请转到php页面并在页面顶部打开php标记后立即添加error_reporting(0)。
答案 4 :(得分:0)
我也遇到了类似的问题,涉及register_activation_hook()
和全局变量$ wp_version:每次激活或停用插件时,我都会在 debug.log 文件中收到以下消息: / p>
PHP注意:未定义的变量:wp_version(...)
当我用get_bloginfo('version')
替换$ wp_version时,问题解决了。
答案 5 :(得分:-2)
目前似乎无法将其作为插件的一部分。