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

8

¿Existe 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 ... con fines de diagnóstico.

David G
fuente

Respuestas:

9

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

MikeSchinkel
fuente
+1. Buen trabajo, Mike. Me pregunto cuántos complementos saldrán de este StackExchange. :)
Annika Backstrom
Gracias. En realidad, espero mucho, pero también espero que solo los mejores lleguen al repositorio. ¡Hay demasiada basura allí arriba ahora mismo!
MikeSchinkel
2

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.

Viper007Bond
fuente
Puede ser mejor para el rendimiento simplemente definir una variable, pero tampoco es muy bueno cambiar el número de versión en 2 lugares. Para los temas, hay una función similar wp_get_theme que incluso se usa en ejemplos: codex.wordpress.org/Child_Themes Parece un mal diseño en WordPress, sería mejor si pudiéramos configurar la versión del complemento a través de una variable y luego reutilizar el variable con las funciones wp_enqueue_style y wp_enqueue_script.
baptx
esto es correcto, sin embargo, esta es una optimización que sería insignificante teniendo en cuenta todo lo demás que Wordpress hace en cada solicitud. En otras palabras, no importa
Paulcol.
1

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.phpllamadas wp_get_active_and_valid_plugins(), que extrae datos de la active_pluginsopción del sitio. Esta opción solo contiene la ruta al archivo del complemento y wp-settings.phpsolo se ejecuta include_onceen el archivo, por lo que nunca se analiza para los metadatos del complemento.

Annika Backstrom
fuente