Cum poate un plugin să își obțină propriul număr de versiune?
Există vreun API pe care îl pot apela, în interiorul plugin-ului meu, pentru a determina versiunea plugin-ului?
Vreau doar ca plugin-ul meu să emită un comentariu HTML cu propriul număr de versiune... în scopuri de diagnosticare.

@david: Atât @Adam Backtrom cât și @Viper007Bond oferă câteva sfaturi bune, așa că m-am gândit să le urmez și să văd dacă nu pot implementa ceva, vezi mai jos.
Urmează un plugin numit WP Active Plugins Data care analizează metadatele din header pentru toate pluginurile active ori de câte ori un plugin este activat și stochează toate metadatele pentru fiecare plugin într-o opțiune de tip array în wp_options
. L-am proiectat atât pentru pluginurile obișnuite WordPress, cât și pentru pluginurile la nivel de rețea în multisite. Puteți să-l descărcați de aici de pe gist, dar am copiat și codul aici pentru revizuirea dumneavoastră:
<?php
/*
Plugin Name: WP Active Plugins Data
Plugin URI: http://mikeschinkel.com/wordpress-plugins/wp-active-plugins-data/
Description: Încarcă Datele Pluginului la Activare și le Salvează în wp_options pentru acces rapid.
Version: 0.1
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
Note: Scris pentru 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; // Nu risca recursivitate infinită
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);
}
Vrei să vezi cum funcționează? Iată un fișier de test pe care îl poți plasa în rădăcina site-ului tău WordPress (http://example.com/test.php
). Asigură-te că ai activat atât acest plugin cât și Akismet înainte de a-l testa.
<?php
/*
* test.php - Plasează în rădăcina site-ului WordPress.
*
* Înainte de a rula, asigură-te că ai activat atât Akismet cât și pluginul WP Active Plugin Data
*
*/
include "wp-load.php";
header('Content-type:text/plain');
$akismet = "akismet/akismet.php";
echo "Versiunea Akismet: " . get_active_plugin_version($akismet);
echo "\n\nDescrierea Akismet: " . get_active_plugin_attribute($akismet,'Description');
echo "\n\nToate Datele Akismet:\n";
print_r(get_active_plugins_data($akismet));
Dacă nu este exact ceea ce ai nevoie, cel puțin ar trebui să-ți ofere un punct de plecare bun. Sper că acest lucru te ajută.

În ecranele de administrare există: get_plugin_data()
. În șabloane, cred că vei avea nevoie ca plugin-ul să stocheze acele date în PHP, de exemplu, să setezi o constantă sau o variabilă globală și să menții acea valoare sincronizată cu numărul de versiune din antetul plugin-ului.
wp-settings.php
apelează wp_get_active_and_valid_plugins()
, care extrage date din opțiunea de site active_plugins
. Această opțiune conține doar calea către fișierul plugin-ului, iar wp-settings.php
doar rulează include_once
pe fișier, deci metadatele plugin-ului nu sunt niciodată analizate.

Poți analiza metadatele plugin-ului tău (acele informații din partea de sus a fișierului), dar este mai bine pentru performanță dacă setezi direct o variabilă PHP cu un număr de versiune corespunzător. Când actualizezi plugin-ul, actualizează ambele numere de versiune.
Este puțin mai mult de lucru pentru tine pe termen scurt, dar mult mai bine pe termen lung.

Ar putea fi mai bine pentru performanță să definim pur și simplu o variabilă, dar nu este foarte elegant să schimbăm numărul versiunii în două locuri. Pentru teme, există o funcție similară wp_get_theme care este chiar folosită în exemple: https://codex.wordpress.org/Child_Themes Pare un design prost în WordPress, ar fi mai bine dacă am putea seta versiunea pluginului printr-o variabilă și apoi să refolosim variabila cu funcțiile wp_enqueue_style și wp_enqueue_script.
