Gibt es eine Möglichkeit für ein Plug-In, seine eigene Versionsnummer zu erhalten?

8

Gibt es eine API, die ich in meinem Plug-In aufrufen kann, um die Version des Plug-Ins zu ermitteln?

Ich möchte nur, dass mein Plug-In einen HTML-Kommentar mit einer eigenen Versionsnummer ausgibt ... zu Diagnosezwecken.

David G.
quelle

Antworten:

9

@david : Sowohl @Adam Backtrom als auch @ Viper007Bond geben einige gute Ratschläge, also dachte ich, ich würde ihren Rat befolgen und sehen, ob ich etwas nicht implementieren könnte, siehe unten.

Was folgt iS ein Plugin namens WP Active Plugins Data , das die Header-Metadaten für alle aktiven Plugins analysiert, sobald ein Plugin aktiviert wird, und alle Metadaten für jedes Plugin in einer Array-Option in speichert wp_options. Ich habe es sowohl für reguläre WordPress-Plugins als auch für Site-weite Plugins mit mehreren Standorten entwickelt. Sie können es hier von gist herunterladen, aber ich habe den Code auch hier für Ihre Überprüfung kopiert:

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

Möchten Sie sehen, wie es funktioniert? Hier ist eine Testdatei, die Sie im Stammverzeichnis Ihrer WordPress-Site ablegen können ( http://example.com/test.php.) Stellen Sie sicher, dass sowohl dieses Plugin als auch Akismet aktiviert sind, bevor Sie es testen.

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

Wenn es nicht genau das ist, was Sie brauchen, sollte es Ihnen einen guten Ausgangspunkt geben. Hoffe das hilft.

MikeSchinkel
quelle
+1. Gute Arbeit, Mike. Ich frage mich, wie viele Plugins aus diesem StackExchange herauskommen werden. :)
Annika Backstrom
Vielen Dank. Eigentlich hoffe ich viel, aber ich hoffe auch, dass nur die Besten ihren Weg in das Repository finden. Dort oben ist momentan zu viel Müll!
MikeSchinkel
2

Sie können die Metadaten Ihres Plugins analysieren (das Zeug oben in der Datei), aber es ist besser für die Leistung, wenn Sie nur Ihre eigene PHP-Variable mit einer passenden Versionsnummer festlegen. Wenn Sie das Plugin aktualisieren, aktualisieren Sie einfach beide Versionsnummern.

Es ist kurzfristig etwas mehr Arbeit für Sie, aber langfristig viel besser.

Viper007Bond
quelle
Für die Leistung ist es vielleicht besser, nur eine Variable zu definieren, aber es ist auch nicht sehr schön, die Versionsnummer an zwei Stellen zu ändern. Für Themen gibt es eine ähnliche Funktion wp_get_theme, die sogar in Beispielen verwendet wird: codex.wordpress.org/Child_Themes Es sieht nach einem schlechten Design in WordPress aus. Es wäre besser, wenn wir die Plugin-Version über eine Variable festlegen und dann die wiederverwenden könnten Variable mit den Funktionen wp_enqueue_style und wp_enqueue_script.
Taufe
Dies ist richtig, dies ist jedoch eine Optimierung, die vernachlässigbar wäre, wenn man bedenkt, was Wordpress bei jeder Anfrage alles andere tut. Mit anderen Worten, es spielt keine Rolle
Paulcol.
1

Es gibt in den Admin-Bildschirmen : get_plugin_data(). Ich denke, dass Sie in Vorlagen das Plugin benötigen, um diese Daten in PHP zu speichern, z. B. eine Konstante oder eine globale Konstante oder etwas anderes, und diesen Wert mit der Versionsnummer des Plugin-Headers synchronisieren.

wp-settings.phpAufrufe wp_get_active_and_valid_plugins(), die Daten von der active_pluginsSite-Option abrufen. Diese Option enthält nur den Pfad zur Plugin-Datei und wird wp-settings.phpnur include_oncefür die Datei ausgeführt, sodass sie nie für die Plugin-Metadaten analysiert wird.

Annika Backstrom
quelle