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

wordpress.stackexchange https://wordpress.stackexchange.com/questions/361

  •  16-10-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

Далее следует плагин под названием WP Active Plugins Данные Это анализирует метаданные заголовка для всех активных плагинов в любое время, когда активируется любой плагин, и он хранит все метаданные для каждого плагина в опцию массива в 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));

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top