Respuestas:
@david : Tanto @Adam Backtrom como @ Viper007Bond dan buenos consejos, así que pensé en seguirlos y ver si no podía implementar algo, ver más abajo.
Lo que sigue es un complemento llamado WP Active Plugins Datos que analiza los metadatos del encabezado de todos los complementos activos cada vez que se activa cualquier complemento y almacena todos los metadatos para cada complemento en una opción de matriz wp_options
. Lo diseñé tanto para plugins regulares de WordPress como para plugins multisitio en todo el sitio. Puede descargarlo aquí desde Gist, pero también he copiado el código aquí para su revisión:
<?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);
}
¿Quieres ver cómo funciona? Aquí hay un archivo de prueba que puede colocar en la raíz de su sitio de WordPress ( http://example.com/test.php
.) Asegúrese de tener tanto este complemento como Akismet activado antes de probarlo.
<?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 no es exactamente lo que necesita, al menos debería darle un buen punto de partida. Espero que esto ayude.
Puede analizar los metadatos de su complemento (esas cosas en la parte superior del archivo), pero es mejor para el rendimiento si solo configura su propia variable PHP con un número de versión coincidente. Cuando actualice el complemento, simplemente actualice ambos números de versión.
Es un poco más de trabajo para usted a corto plazo, pero mucho mejor a largo plazo.
Hay en las pantallas de administración: get_plugin_data()
. En las plantillas, creo que necesitará el complemento para mantener esos datos en PHP, por ejemplo, establecer una constante o global o algo así, y mantener ese valor sincronizado con el número de versión del encabezado del complemento.
wp-settings.php
llamadas wp_get_active_and_valid_plugins()
, que extrae datos de la active_plugins
opción del sitio. Esta opción solo contiene la ruta al archivo del complemento y wp-settings.php
solo se ejecuta include_once
en el archivo, por lo que nunca se analiza para los metadatos del complemento.