it-swarm-es.com

¿Hay alguna forma de que un complemento obtenga su propio número de versión?

¿Hay una API a la que pueda llamar, dentro de mi complemento, para determinar la versión del complemento?

Solo quiero que mi complemento emita un comentario html con su propio número de versión ... para fines de diagnóstico.

8
David G

@david : Tanto @Adam Backtrom como @ Viper007Bond dan un buen consejo, así que pensé que seguiría su consejo y vería si no podía implementar algo, vea más abajo.

Lo que sigue es un complemento llamadoWP Datos de complementos activosque analiza los metadatos del encabezado de todos los complementos activos cada vez que se activa cualquier complemento y almacena todos los metadatos para cada uno plugin en una opción de matriz en wp_options. Lo diseñé tanto para los complementos de WordPress normales como para los complementos de sitios múltiples. 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 este complemento y Akismet activados 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.

9
MikeSchinkel

Puede analizar los metadatos de su complemento (esas cosas en la parte superior del archivo), pero es mejor para el rendimiento si simplemente configura su propia PHP variable con un número de versión correspondiente. 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.

2
Viper007Bond

Hay en las pantallas de administración: get_plugin_data(). En 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 llama a wp_get_active_and_valid_plugins(), que extrae datos de la opción del sitio active_plugins. Esta opción solo contiene la ruta al archivo del complemento, y wp-settings.php solo ejecuta include_once en el archivo, por lo que nunca se analiza para los metadatos del complemento.

1
Annika Backstrom