Antworten:
@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.
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.
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.php
Aufrufe wp_get_active_and_valid_plugins()
, die Daten von der active_plugins
Site-Option abrufen. Diese Option enthält nur den Pfad zur Plugin-Datei und wird wp-settings.php
nur include_once
für die Datei ausgeführt, sodass sie nie für die Plugin-Metadaten analysiert wird.