it-swarm.dev

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

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 ... für Diagnosezwecke.

8
David G

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

Was folgt, ist ein Plugin mit dem NamenWP 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 speichert Plugin in eine Array-Option in wp_options. Ich habe es sowohl für reguläre WordPress-Plugins als auch für standortübergreifende Plugins entwickelt. Sie können es hier von Gist herunterladen aber ich habe auch den Code hier für Ihre Rezension 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.) Vergewissern Sie sich, 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.

9
MikeSchinkel

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

Kurzfristig ist es etwas mehr Arbeit für Sie, aber langfristig viel besser.

2
Viper007Bond

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 ein globales oder etwas anderes, und diesen Wert mit der Versionsnummer des Plugin-Headers synchron zu halten.

wp-settings.php ruft wp_get_active_and_valid_plugins() auf, wodurch Daten aus der Option active_plugins site abgerufen werden. Diese Option enthält nur den Pfad zur Plugin-Datei, und wp-settings.php führt nur include_once für die Datei aus, sodass die Plugin-Metadaten nicht analysiert werden.

1