web-dev-qa-db-fra.com

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

Existe-t-il une API que je peux appeler, dans 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.

8
David G

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

Ce qui suit est un plugin appeléWP Data Plugins Activequi analyse les métadonnées de l’en-tête de tous les plugins actifs à chaque fois qu’un plugin est activé et stocke toutes les métadonnées de chacun. plugin dans une option de tableau dans wp_options. Je l'ai conçu pour les plugins WordPress ordinaires et les plugins multisites à l'échelle du site. Vous pouvez le télécharger ici depuis Gist mais j'ai aussi copié le code ici pour votre commentaire:

<?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 ça marche? 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.

9
MikeSchinkel

Vous pouvez analyser les métadonnées de votre plugin (ce qui se trouve en haut du fichier), mais les performances sont meilleures si vous définissez votre propre variable PHP avec un numéro de version correspondant. Lorsque vous mettez à jour le plug-in, il suffit de mettre à jour les deux numéros de version.

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

2
Viper007Bond

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

wp-settings.php appelle wp_get_active_and_valid_plugins(), qui extrait les données de l'option de site active_plugins. Cette option ne contient que le chemin du fichier de plug-in, et wp-settings.php n'exécute que include_once sur le fichier. Par conséquent, il n'est jamais analysé pour les métadonnées du plug-in.

1
Annika Backstrom