Esiste un modo per un plug-in di ottenere il proprio numero di versione?

14 ago 2010, 23:13:33
Visualizzazioni: 9.23K
Voti: 8

Esiste un'API che posso chiamare, all'interno del mio plug-in, per determinare la versione del plug-in?

Voglio semplicemente che il mio plug-in emetta un commento HTML con il proprio numero di versione... a scopo diagnostico.

0
Tutte le risposte alla domanda 3
2

@david: Sia @Adam Backtrom che @Viper007Bond hanno dato dei buoni consigli, quindi ho pensato di seguirli e vedere se non riuscissi a implementare qualcosa. Vedi sotto.

Quello che segue è un plugin chiamato WP Active Plugins Data che analizza i metadati dell'intestazione per tutti i plugin attivi ogni volta che un plugin viene attivato e memorizza tutti i metadati per ogni plugin in un'opzione array in wp_options. L'ho progettato sia per i plugin WordPress regolari che per i plugin multisito a livello di sito. Puoi scaricarlo qui da gist ma ho anche copiato il codice qui per la tua revisione:

<?php
/*
Plugin Name: WP Active Plugins Data
Plugin URI: http://mikeschinkel.com/wordpress-plugins/wp-active-plugins-data/
Description: Carica i Dati del Plugin all'Attivazione e li Persiste in wp_options per un Recupero Rapido.
Version: 0.1
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
Note: Scritto per 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; // Non rischiare una ricorsione 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);
}

Vuoi vedere come funziona? Ecco un file di test che puoi inserire nella root del tuo sito WordPress (http://example.com/test.php). Assicurati di avere sia questo plugin che Akismet attivati prima di testarlo.

<?php
/*
* test.php - Posiziona nella root del sito WordPress.
*
* Prima di eseguire assicurati di attivare sia Akismet che il plugin WP Active Plugin Data
*
*/

include "wp-load.php";

header('Content-type:text/plain');
$akismet = "akismet/akismet.php";
echo "Versione di Akismet: " . get_active_plugin_version($akismet);
echo "\n\nDescrizione di Akismet: " . get_active_plugin_attribute($akismet,'Description');
echo "\n\nTutti i Dati di Akismet:\n";
print_r(get_active_plugins_data($akismet));

Se non è esattamente ciò di cui hai bisogno, almeno dovrebbe darti un buon punto di partenza. Spero che questo ti aiuti.

15 ago 2010 05:57:00
Commenti

+1. Bel lavoro, Mike. Mi chiedo quanti plugin usciranno da questo StackExchange. :)

User User
15 ago 2010 15:32:41

Grazie. In realtà, spero molto ma spero anche che solo il meglio riesca a entrare nel repository. C'è troppa spazzatura lì dentro in questo momento!

MikeSchinkel MikeSchinkel
15 ago 2010 19:28:22
0

Nelle schermate di amministrazione c'è: get_plugin_data(). Nei template, penso che avrai bisogno che il plugin mantenga quei dati in PHP, ad esempio impostando una costante o una variabile globale, e mantenga quel valore sincronizzato con il numero di versione nell'header del plugin.

wp-settings.php chiama wp_get_active_and_valid_plugins(), che recupera i dati dall'opzione del sito active_plugins. Questa opzione contiene solo il percorso del file del plugin, e wp-settings.php esegue solo include_once sul file, quindi non viene mai analizzato per i metadati del plugin.

15 ago 2010 04:42:41
2

Puoi analizzare i metadati del tuo plugin (quella parte all'inizio del file), ma è meglio per le prestazioni se imposti semplicemente una tua variabile PHP con un numero di versione corrispondente. Quando aggiorni il plugin, aggiorna semplicemente entrambi i numeri di versione.

Richiede un po' più di lavoro a breve termine, ma è molto meglio a lungo termine.

15 ago 2010 01:47:45
Commenti

Potrebbe essere meglio per le prestazioni definire semplicemente una variabile, ma non è molto elegante dover cambiare il numero di versione in due punti diversi. Per i temi, esiste una funzione simile wp_get_theme che viene addirittura utilizzata negli esempi: https://codex.wordpress.org/Child_Themes Sembra un difetto di progettazione in WordPress, sarebbe meglio se potessimo impostare la versione del plugin attraverso una variabile e poi riutilizzare la stessa variabile con le funzioni wp_enqueue_style e wp_enqueue_script.

baptx baptx
11 gen 2018 21:04:54

questo è corretto, tuttavia, si tratta di un'ottimizzazione che sarebbe trascurabile considerando tutto ciò che Wordpress fa ad ogni richiesta. In altre parole, non ha importanza

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