Existe-t-il un moyen pour un plug-in d'obtenir son propre numéro de version?

8

Existe-t-il une API que je peux appeler, à l'intérieur de mon plug-in, pour déterminer la version du plug-in?

Je veux juste que mon plug-in émette un commentaire html avec son propre numéro de version ... à des fins de diagnostic.

David G
la source

Réponses:

9

@david : @Adam Backtrom et @ Viper007Bond donnent tous deux de bons conseils, alors j'ai pensé suivre leurs conseils et voir si je ne pouvais pas mettre en œuvre quelque chose, voir ci-dessous.

Ce qui suit est un plug-in appelé WP Active Plugins Data qui analyse les métadonnées d'en-tête pour tous les plug-ins actifs chaque fois qu'un plug-in est activé et stocke toutes les métadonnées de chaque plug-in dans une option de tableau dans wp_options. Je l'ai conçu pour les plugins WordPress réguliers et les plugins multisites à l'échelle du site. Vous pouvez le télécharger ici depuis gist mais j'ai également copié le code ici pour votre examen:

<?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);
}

Vous voulez voir comment cela fonctionne? Voici un fichier de test que vous pouvez déposer à la racine de votre site WordPress ( http://example.com/test.php.) Assurez-vous que ce plugin et Akismet sont activés avant de le tester.

<?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 ce n'est pas exactement ce dont vous avez besoin, cela devrait vous donner un bon point de départ. J'espère que cela t'aides.

MikeSchinkel
la source
+1. Beau travail, Mike. Je me demande combien de plugins sortiront de ce StackExchange. :)
Annika Backstrom
Merci. En fait, j'espère beaucoup, mais j'espère aussi que seuls les meilleurs feront leur chemin dans le référentiel. Il y a trop de déchets là-haut en ce moment!
MikeSchinkel
2

Vous pouvez analyser les métadonnées de votre plugin (ce truc en haut du fichier), mais c'est mieux pour les performances si vous définissez simplement votre propre variable PHP avec un numéro de version correspondant. Lorsque vous mettez à jour le plugin, mettez simplement à jour les deux numéros de version.

C'est un peu plus de travail pour vous à court terme, mais beaucoup mieux à long terme.

Viper007Bond
la source
Il peut être préférable pour les performances de simplement définir une variable, mais il n'est pas non plus très agréable de changer le numéro de version à 2 endroits. Pour les thèmes, il existe une fonction similaire wp_get_theme qui est même utilisée dans les exemples: codex.wordpress.org/Child_Themes Cela ressemble à une mauvaise conception dans WordPress, il serait préférable de définir la version du plugin via une variable, puis de réutiliser le variable avec les fonctions wp_enqueue_style et wp_enqueue_script.
baptx
c'est correct, cependant, c'est une optimisation qui serait négligeable compte tenu de tout le reste que Wordpress fait à chaque demande. En d'autres termes, cela n'a pas d'importance
Paulcol.
1

Il y a dans les écrans d'administration: get_plugin_data(). Dans les modèles, je pense que vous aurez besoin du plugin pour contenir ces données en PHP, par exemple, définir une constante ou globale ou quelque chose, et garder cette valeur synchronisée avec le numéro de version de l'en-tête du plugin.

wp-settings.phpappels wp_get_active_and_valid_plugins(), qui extrait les données de l' active_pluginsoption de site. Cette option ne contient que le chemin d'accès au fichier du plugin et wp-settings.phpne s'exécute que include_oncesur le fichier, il n'est donc jamais analysé pour les métadonnées du plugin.

Annika Backstrom
la source