Existe uma maneira de um plug-in obter seu próprio número de versão?

8

Existe uma API que eu possa chamar, dentro do meu plug-in, para determinar a versão do plug-in?

Eu só quero que meu plug-in emita um comentário html com seu próprio número de versão ... para fins de diagnóstico.

David G
fonte

Respostas:

9

@ David : Ambos @ Adam Backtrom e @ Viper007Bond dão bons conselhos, então pensei em seguir os conselhos deles e ver se não poderia implementar algo, veja abaixo.

O que segue é um plug-in chamado WP Active Plugins Data que analisa os metadados do cabeçalho de todos os plug-ins ativos sempre que um plug-in é ativado e armazena todos os metadados de cada plug-in em uma opção de matriz wp_options. Eu o projetei para plugins regulares do WordPress e plug-ins em vários sites em todo o site. Você pode baixá-lo aqui no gist, mas também copiei o código aqui para sua revisão:

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

Quer ver como funciona? Aqui está um arquivo de teste que você pode inserir na raiz do seu site WordPress ( http://example.com/test.php.) Certifique-se de ter este plugin e o Akismet ativados antes de testá-lo.

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

Se não é exatamente o que você precisa, pelo menos, deve lhe dar um bom ponto de partida. Espero que isto ajude.

MikeSchinkel
fonte
+1. Bom trabalho, Mike. Gostaria de saber quantos plugins sairão deste StackExchange. :)
Annika Backstrom
Obrigado. Na verdade, espero muito, mas também espero que apenas os melhores cheguem ao repositório. Há muito lixo lá em cima agora!
MikeSchinkel
2

Você pode analisar os metadados do seu plug-in (as coisas na parte superior do arquivo), mas é melhor para o desempenho se você apenas definir sua própria variável PHP com um número de versão correspondente. Ao atualizar o plug-in, basta atualizar os dois números de versão.

É um pouco mais trabalhoso para você no curto prazo, mas muito melhor no longo prazo.

Viper007Bond
fonte
Pode ser melhor para o desempenho definir apenas uma variável, mas também não é muito bom alterar o número da versão em 2 locais. Para temas, existe uma função semelhante wp_get_theme que é usada até em exemplos: codex.wordpress.org/Child_Themes Parece um design ruim no WordPress, seria melhor se pudéssemos definir a versão do plug-in através de uma variável e depois reutilizar o variável com as funções wp_enqueue_style e wp_enqueue_script.
baptx
isso está correto, no entanto, esta é uma otimização que seria insignificante, considerando tudo o que o Wordpress faz em cada solicitação. Em outras palavras, isso não importa
paulcol.
1

Há nas telas de administração: get_plugin_data(). Nos modelos, acho que você precisará do plugin para armazenar esses dados em PHP, por exemplo, defina uma constante ou global ou algo assim e mantenha esse valor sincronizado com o número da versão do cabeçalho do plugin.

wp-settings.phpchamadas wp_get_active_and_valid_plugins(), que extraem dados da active_pluginsopção do site. Esta opção contém apenas o caminho para o arquivo do plug-in e wp-settings.phpé executado apenas include_onceno arquivo, portanto nunca é analisado pelos metadados do plug-in.

Annika Backstrom
fonte