Есть ли способ для плагина получить свой номер версии?

8

Есть ли API, который я могу вызвать внутри моего плагина, чтобы определить версию плагина?

Я просто хочу, чтобы мой плагин выдавал html-комментарий со своим собственным номером версии ... для диагностических целей.

Дэвид Г
источник

Ответы:

9

@david : @Adam Backtrom и @ Viper007Bond дают несколько полезных советов, поэтому я решил воспользоваться их советом и посмотреть, не смогу ли я что-то реализовать, см. ниже.

Далее следует плагин WP Active Plugins Data, который анализирует метаданные заголовка для всех активных плагинов каждый раз, когда активируется любой плагин, и сохраняет все метаданные для каждого плагина в параметре массива wp_options. Я разработал его как для обычных плагинов WordPress, так и для многосайтовых плагинов для всего сайта. Вы можете скачать его здесь с gist, но я также скопировал код здесь для вашего обзора:

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

Хотите посмотреть, как это работает? Вот тестовый файл, который вы можете поместить в корень вашего сайта WordPress ( http://example.com/test.php.) Убедитесь, что у вас активированы и этот плагин, и Akismet, прежде чем тестировать его.

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

Если это не совсем то, что вам нужно, по крайней мере, это должно дать вам хорошую отправную точку. Надеюсь это поможет.

MikeSchinkel
источник
+1. Отличная работа, Майк. Интересно, сколько плагинов выйдет из этого StackExchange. :)
Анника Бэкстрем
Спасибо. На самом деле, я надеюсь на многое, но я также надеюсь, что только лучшие попадут в хранилище. Там сейчас слишком много мусора!
MikeSchinkel
2

Вы можете анализировать метаданные вашего плагина (эти вещи в верхней части файла), но это будет лучше для производительности, если вы просто установите свою собственную переменную PHP с соответствующим номером версии. Когда вы обновите плагин, просто обновите обе версии.

Это немного больше работы для вас в краткосрочной перспективе, но намного лучше в долгосрочной перспективе.

Viper007Bond
источник
Для производительности может быть лучше просто определить переменную, но также не очень приятно менять номер версии в 2 местах. Для тем есть похожая функция wp_get_theme, которая даже используется в примерах: codex.wordpress.org/Child_Themes. В WordPress плохой дизайн, было бы лучше, если бы мы могли установить версию плагина через переменную, а затем повторно использовать переменная с функциями wp_enqueue_style и wp_enqueue_script.
baptx
это правильно, однако, это одна оптимизация будет незначительной, учитывая все остальное, что Wordpress делает для каждого запроса. Другими словами, это не имеет значения
Полколь.
1

Существует на экранах администратора: get_plugin_data(). В шаблонах, я думаю, вам понадобится плагин для хранения этих данных в PHP, например, для установки константы или глобальной переменной или чего-то подобного, и для синхронизации этого значения с номером версии заголовка плагина.

wp-settings.phpзвонки wp_get_active_and_valid_plugins(), которые тянет данные с active_pluginsсайта вариант. Эта опция содержит только путь к файлу плагина и wp-settings.phpработает только include_onceс файлом, поэтому он никогда не анализируется для метаданных плагина.

Анника Бэкстрем
источник