問題描述
在我的 plug-in 裡面有可以呼叫的 API 來確定 plug-in 的版本嗎?
我只是想讓我的 plug-in 釋出一個 html 評論與它自己的版本號… 為了診斷目的。
最佳解決思路
@david:@Adam Backtrom 和 @ Viper007Bond 都提供了一些好的建議,所以我以為我會採取他們的建議,看看我是否無法實現某些內容,見下文。
以下是 iS 一個稱為 WP Active Plugins Data 的外掛,用於在任何外掛被啟用時解析所有活動外掛的頭後設資料,並將每個外掛的所有後設資料儲存到 wp_options 中的陣列選項中。我設計了常規 WordPress 外掛和多站點 site-wide 外掛。你可以 download it here from 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 "nnAkismet Description: " . get_active_plugin_attribute($akismet,'Description');
echo "nnAll Akismet Data:n";
print_r(get_active_plugins_data($akismet));
如果不是你所需要的,至少應該給你一個很好的起點。希望這可以幫助。
次佳解決思路
您可以解析您的外掛的後設資料 (該檔案頂部的東西),但是如果您只使用匹配的版本號設定自己的 PHP 變數,那麼效能會更好。更新外掛時,只需更新兩個版本號。
在短期內,您的工作稍微多一點,但長期來說要好多了。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。