Réponses:
@david : @Adam Backtrom et @ Viper007Bond donnent tous deux de bons conseils, alors j'ai pensé suivre leurs conseils et voir si je ne pouvais pas mettre en œuvre quelque chose, voir ci-dessous.
Ce qui suit est un plug-in appelé WP Active Plugins Data qui analyse les métadonnées d'en-tête pour tous les plug-ins actifs chaque fois qu'un plug-in est activé et stocke toutes les métadonnées de chaque plug-in dans une option de tableau dans wp_options
. Je l'ai conçu pour les plugins WordPress réguliers et les plugins multisites à l'échelle du site. Vous pouvez le télécharger ici depuis gist mais j'ai également copié le code ici pour votre examen:
<?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);
}
Vous voulez voir comment cela fonctionne? Voici un fichier de test que vous pouvez déposer à la racine de votre site WordPress ( http://example.com/test.php
.) Assurez-vous que ce plugin et Akismet sont activés avant de le tester.
<?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));
Si ce n'est pas exactement ce dont vous avez besoin, cela devrait vous donner un bon point de départ. J'espère que cela t'aides.
Vous pouvez analyser les métadonnées de votre plugin (ce truc en haut du fichier), mais c'est mieux pour les performances si vous définissez simplement votre propre variable PHP avec un numéro de version correspondant. Lorsque vous mettez à jour le plugin, mettez simplement à jour les deux numéros de version.
C'est un peu plus de travail pour vous à court terme, mais beaucoup mieux à long terme.
Il y a dans les écrans d'administration: get_plugin_data()
. Dans les modèles, je pense que vous aurez besoin du plugin pour contenir ces données en PHP, par exemple, définir une constante ou globale ou quelque chose, et garder cette valeur synchronisée avec le numéro de version de l'en-tête du plugin.
wp-settings.php
appels wp_get_active_and_valid_plugins()
, qui extrait les données de l' active_plugins
option de site. Cette option ne contient que le chemin d'accès au fichier du plugin et wp-settings.php
ne s'exécute que include_once
sur le fichier, il n'est donc jamais analysé pour les métadonnées du plugin.