插件有没有办法获取自己的版本号?


8

插件内部是否可以调用一个API来确定插件的版本?

我只想让我的插件发出一个带有其自己的版本号的html注释...以用于诊断。

Answers:


9

@david:@Adam Backtrom和@ Viper007Bond都给出了一些好的建议,所以我想我会听取他们的建议,看看我是否无法实现某些功能,请参见下文。

紧随其后的是一个名为WP Active Plugins的插件,该数据可在任何插件被激活时解析所有活动插件的标头元数据,并将每个插件的所有元数据存储在中的array选项中wp_options。我为常规WordPress插件和多站点站点范围的插件设计了它。您可以从gist此处下载它,但我也将代码复制到此处供您查看:

<?php
/*
Plugin Name: WP Active Plugins Data
Plugin URI: http://mikeschinkel.com/wordpress-plugins/wp-active-plugins-data/
Description: Loads Plugin Data on Plugin Activation and Persists to wp_options for quick retrieval.
Version: 0.1
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
Note: Written for http://wordpress.stackexchange.com/questions/361/is-there-a-way-for-a-plug-in-to-get-its-own-version-number
*/

require_once(ABSPATH.'wp-admin/includes/plugin.php');

function get_active_plugin_version($plugin_path_file, $sitewide = false) {
    return get_active_plugin_attribute($plugin_path_file,'Version');
}
function get_active_plugin_attribute($plugin_path_file, $attribute) {
    $all_plugins_data = get_active_plugins_data($plugin_path_file,$sitewide);
    return (isset($all_plugins_data[$attribute]) ? $all_plugins_data[$attribute] : false);
}
function get_active_plugins_data($plugin_path_file, $sitewide = false) {
    $failsafe = false;
    $plugin = plugin_basename(trim($plugin_path_file));
    $sitewide = (is_multisite() && ( $sitewide || is_network_only_plugin($plugin)));
    if ($sitewide) {
        $all_plugins_data = get_site_option('active_sitewide_plugin_data',array());
    } else {
        $all_plugins_data = get_option('active_plugin_data',array());
    }
    if (!$failsafe && !is_array($all_plugins_data) || count($all_plugins_data)==0) {
        $failsafe = true; // Don't risk infinite recursion
        if ($sitewide) {
            $active_plugins = get_site_option('active_sitewide_plugins',array());
        } else {
            $active_plugins = get_option('active_plugins',array());
        }
        persist_active_plugin_data(null,$active_plugins,$sitewide);
        $all_plugins_data = get_active_plugin_version($plugin_path_file,$sitewide);
    }
    return $all_plugins_data[$plugin_path_file];
}
add_action('update_site_option_active_sitewide_plugins','persist_sitewide_active_plugin_data',10,2);
function persist_sitewide_active_plugin_data($option, $plugins) {
    persist_active_plugin_data(null,$plugins,'sitewide');
}
add_filter('update_option_active_plugins','persist_active_plugin_data',10,2);
function persist_active_plugin_data($old_plugins, $new_plugins, $sitewide=false) {
    $active_plugin_data = array_flip($new_plugins);
    $plugin_dir = WP_PLUGIN_DIR;
    foreach($new_plugins as $plugin) {
        $active_plugin_data[$plugin] = get_plugin_data("$plugin_dir/$plugin");
    }
    if ($sitewide)
        update_site_option('active_sitewide_plugin_data',$active_plugin_data);
    else
        update_site_option('active_plugin_data',$active_plugin_data);
}

想看看它是如何工作的?这是一个测试文件,您可以将其放置在WordPress网站的根目录(http://example.com/test.php。)中,请确保在测试前已激活此插件和Akismet。

<?php
/*
* test.php - Place in root of WordPress website.
*
* Before running be sure to activate both Akismet and the WP Active Plugin Data plugin
*
*/

include "wp-load.php";

header('Content-type:text/plain');
$akismet = "akismet/akismet.php";
echo "Akismet Version: " . get_active_plugin_version($akismet);
echo "\n\nAkismet Description: " . get_active_plugin_attribute($akismet,'Description');
echo "\n\nAll Akismet Data:\n";
print_r(get_active_plugins_data($akismet));

如果不是您真正需要的,至少应该为您提供一个良好的起点。希望这可以帮助。


+1。干得好,迈克。我不知道有多少插件会从StackExchange中出来。:)
Annika Backstrom

谢谢。实际上,我希望很多,但也希望只有最好的才能进入存储库。现在那里有太多垃圾!
MikeSchinkel 2010年

2

您可以解析插件的元数据(位于文件顶部的元数据),但是如果您只设置具有匹配版本号的PHP变量,则对性能会更好。更新插件时,只需更新两个版本号。

从短期来看,这对您来说要多做些工作,但从长远来看,要好得多。


仅定义变量可能对性能更好,但是在2个位置更改版本号也不是一件好事。对于主题,有一个类似的函数wp_get_theme甚至在示例中使用:codex.wordpress.org/Child_Themes在WordPress中,这看起来像是一个不好的设计,如果我们可以通过变量设置插件版本,然后重用wp_enqueue_style和wp_enqueue_script函数的变量。
baptx

这是正确的,但是考虑到Wordpress对每个请求所做的其他一切,这是一个微不足道的优化。换句话说,没关系
paulcol。

1

在管理屏幕中有:get_plugin_data()。在模板中,我认为您将需要插件将这些数据保存在PHP中,例如,设置一个常量或全局值,或使该值与插件头版本号保持同步。

wp-settings.phpCalls wp_get_active_and_valid_plugins(),从active_pluginssite选项中提取数据。此选项仅包含插件文件的路径,并且wp-settings.phpinclude_once在该文件上运行,因此不会为插件元数据进行解析。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.