¿Existe una forma de que un plugin obtenga su propio número de versión?
¿Existe una API que pueda llamar, dentro de mi plugin, para determinar la versión del plugin?
Solo quiero que mi plugin emita un comentario HTML con su propio número de versión... para fines de diagnóstico.

@david: Tanto @Adam Backtrom como @Viper007Bond dan buenos consejos, así que pensé en seguir sus recomendaciones e implementar algo. Mira a continuación.
Lo que sigue es un plugin llamado WP Active Plugins Data que analiza los metadatos del encabezado de todos los plugins activos cada vez que se activa cualquier plugin y almacena todos los metadatos de cada plugin en una opción de array en wp_options
. Lo diseñé tanto para plugins regulares de WordPress como para plugins multisitio a nivel de red. Puedes descargarlo aquí desde gist, pero también he copiado el código aquí para tu revisión:
<?php
/*
Plugin Name: WP Active Plugins Data
Plugin URI: http://mikeschinkel.com/wordpress-plugins/wp-active-plugins-data/
Description: Carga los datos del plugin al activarlo y los guarda en wp_options para una recuperación rápida.
Version: 0.1
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
Note: Escrito para 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; // Evitar recursión infinita
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 puedes colocar en la raíz de tu sitio WordPress (http://example.com/test.php
). Asegúrate de tener activos tanto este plugin como Akismet antes de probarlo.
<?php
/*
* test.php - Coloca en la raíz del sitio WordPress.
*
* Antes de ejecutar, asegúrate de activar tanto Akismet como el plugin WP Active Plugin Data
*
*/
include "wp-load.php";
header('Content-type:text/plain');
$akismet = "akismet/akismet.php";
echo "Versión de Akismet: " . get_active_plugin_version($akismet);
echo "\n\nDescripción de Akismet: " . get_active_plugin_attribute($akismet,'Description');
echo "\n\nTodos los datos de Akismet:\n";
print_r(get_active_plugins_data($akismet));
Si no es exactamente lo que necesitas, al menos debería darte un buen punto de partida. Espero que esto ayude.

En las pantallas de administración existe: get_plugin_data()
. En las plantillas, creo que necesitarás que el plugin almacene esos datos en PHP, por ejemplo, estableciendo una constante o variable global, y mantener ese valor sincronizado con el número de versión en la cabecera del plugin.
wp-settings.php
llama a wp_get_active_and_valid_plugins()
, que obtiene los datos de la opción del sitio active_plugins
. Esta opción solo contiene la ruta al archivo del plugin, y wp-settings.php
solo ejecuta include_once
en el archivo, por lo que nunca se analiza para obtener los metadatos del plugin.

Puedes analizar los metadatos de tu plugin (eso que está en la parte superior del archivo), pero es mejor para el rendimiento si simplemente estableces tu propia variable PHP con un número de versión coincidente. Cuando actualices el plugin, solo actualiza ambos números de versión.
Es un poco más de trabajo para ti a corto plazo, pero mucho mejor a largo plazo.

Puede ser mejor para el rendimiento simplemente definir una variable, pero tampoco es muy agradable cambiar el número de versión en 2 lugares. Para temas, hay una función similar wp_get_theme que incluso se usa en ejemplos: https://codex.wordpress.org/Child_Themes Parece un mal diseño en WordPress, sería mejor si pudiéramos establecer la versión del plugin a través de una variable y luego reutilizar la variable con las funciones wp_enqueue_style y wp_enqueue_script.
