Jawaban:
@david : @Adam Backtrom dan @ Viper007Bond memberikan beberapa saran bagus, jadi saya pikir saya akan mengambil saran mereka dan melihat apakah saya tidak dapat mengimplementasikan sesuatu, lihat di bawah.
Apa yang mengikuti iS sebuah plugin bernama WP Active Plugins Data yang mem-parsing metadata header untuk semua plugin yang aktif setiap kali plugin diaktifkan dan menyimpan semua metadata untuk setiap plugin ke dalam opsi array di wp_options
. Saya mendesainnya untuk plugin WordPress reguler dan plugin multisite untuk seluruh situs. Anda dapat mengunduhnya di sini dari intisari tetapi saya juga menyalin kode di sini untuk ulasan Anda:
<?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);
}
Ingin melihat cara kerjanya? Berikut ini adalah file uji yang dapat Anda masukkan di root situs WordPress Anda ( http://example.com/test.php
.) Pastikan Anda telah mengaktifkan plugin ini dan Akismet sebelum Anda mengujinya.
<?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));
Jika tidak tepat yang Anda butuhkan setidaknya itu akan memberi Anda titik awal yang baik. Semoga ini membantu.
Anda dapat menguraikan meta data plugin Anda (hal-hal di bagian atas file), tetapi lebih baik untuk kinerja jika Anda hanya mengatur variabel PHP Anda sendiri dengan nomor versi yang cocok. Saat Anda memperbarui plugin, perbarui kedua nomor versi.
Ini sedikit lebih bekerja untuk Anda dalam jangka pendek, tetapi jauh lebih baik dalam jangka panjang.
Ada di layar admin: get_plugin_data()
. Dalam templat, saya pikir Anda akan memerlukan plugin untuk menyimpan data itu dalam PHP, misalnya, menetapkan konstanta atau global atau sesuatu, dan menjaga nilai itu disinkronkan dengan nomor versi header plugin.
wp-settings.php
panggilan wp_get_active_and_valid_plugins()
, yang menarik data dari active_plugins
opsi situs. Opsi ini hanya berisi path ke file plugin, dan wp-settings.php
hanya berjalan include_once
pada file, jadi itu tidak pernah diuraikan untuk metadata plugin.