Cum poate un plugin să își obțină propriul număr de versiune?

14 aug. 2010, 23:13:33
Vizualizări: 9.23K
Voturi: 8

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.

0
Toate răspunsurile la întrebare 3
2

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

15 aug. 2010 05:57:00
Comentarii

+1. Bună treabă, Mike. Mă întreb câte plugin-uri vor ieși din acest StackExchange. :)

User User
15 aug. 2010 15:32:41

Mulțumesc. De fapt, sper pentru multe, dar sper și că doar cele mai bune vor ajunge în repository. Există prea mult gunoi acolo acum!

MikeSchinkel MikeSchinkel
15 aug. 2010 19:28:22
0

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

15 aug. 2010 04:42:41
2

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.

15 aug. 2010 01:47:45
Comentarii

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.

baptx baptx
11 ian. 2018 21:04:54

acest lucru este corect, totuși, această optimizare ar fi neglijabilă având în vedere tot ceea ce Wordpress face la fiecare solicitare. Cu alte cuvinte, nu contează

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