¿Existe una forma de que un plugin obtenga su propio número de versión?

14 ago 2010, 23:13:33
Vistas: 9.23K
Votos: 8

¿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.

0
Todas las respuestas a la pregunta 3
2

@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.

15 ago 2010 05:57:00
Comentarios

+1. Buen trabajo, Mike. Me pregunto cuántos plugins saldrán de este StackExchange. :)

User User
15 ago 2010 15:32:41

Gracias. En realidad, tengo muchas esperanzas, pero también espero que solo lo mejor llegue al repositorio. ¡Hay demasiada basura allí ahora mismo!

MikeSchinkel MikeSchinkel
15 ago 2010 19:28:22
0

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.

15 ago 2010 04:42:41
2

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.

15 ago 2010 01:47:45
Comentarios

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.

baptx baptx
11 ene 2018 21:04:54

esto es correcto, sin embargo, esta optimización sería insignificante considerando todo lo demás que Wordpress hace en cada solicitud. En otras palabras, no importa

paulcol. paulcol.
13 ago 2019 22:20:01