Como: obter o plugin principal / arquivo de tema?

2

Existem as funções get_theme_data(); & get_plugin_data(); - que usam get_file_data(); e precisa de um arquivo específico como $input .

Eu tenho um conjunto de classes que podem ser usadas por um plug-in ou um tema, sem um local específico. Tudo funciona, mas eu não sei como eu determinaria qual é o plugin ou arquivo de tema main - quero dizer aquele que contém o cabeçalho do comentário que contém as informações (Versão, Autor, etc.) o tema / plug-in.

    
por kaiser 13.06.2011 / 20:17

3 respostas

2

Como obter os dados do cabeçalho do comentário de um tema OU plug-in ...

... que contém uma classe específica.

O seguinte mostra como você pode descartar uma classe dentro de qualquer plug-in ou tema e ainda conseguir obter qualquer conteúdo de tema ou plug-in do cabeçalho do comentário. Isso é útil para atualizar settings / db-options, por exemplo.

Você não sabe:

  1. se for um plug-in, um plug-in mu ou um tema
  2. e como aninharam profundamente o seu tema container / raiz ou a pasta de plug-ins.

Notas:

  1. Também funciona para plugins mu.
  2. Pode não funcionar se um diretório de tema adicional foi registrado posteriormente (graças ao @toscho para a dica).
  3. Teste de desempenho para um tema mostra 0,0042 seg. tempo de carregamento em 1.000 execuções.
  4. As seguintes funções são destinadas a residir em uma classe.
/**
 * Plugin root
 * @return Full Path to plugin folder
 */
public function set_root_path() 
{
    $_path = trailingslashit( str_replace( basename( __FILE__ ), "", plugin_basename( __FILE__ ) ) );

    // Allow overriding the location
    $_path = apply_filters( __CLASS__.'_root', $_path );

    return $this->_path = $_path;
}


/**
 * Gets the data of the base 'theme' / 'plugin' / 'wpmuplugin'
 * Performance: average loading time on a local (not vanilla) install for 1.000 runs: 0.0042 sec.
 * 
 * @param (mixed) $value
 * @return (array) $value | Theme/Plugin comment header data OR false on failure | default: 'Version'
 */
public function get_data( $value = 'Version' )
{
    // Class basename - String to Array
    $_path_data = explode( '/', $this->_path );
    // Get rid of the last element, as it's only a trailing slash
    array_pop( $_path_data );
    // reverse for faster processing
    krsort( $_path_data );

    // Themes basename
    $theme_roots = get_theme_roots();
    // In case some used register_theme_directory(); before
    // Might not work if an additional themes directory will be registered later
    // Thanks to @Thomas Scholz <http://toscho.de> for the hint
    if ( is_array( $theme_roots ) )
    {    
        foreach ( $_path_data as $_path_part )
        {
            foreach( $theme_roots as $root )
            {
                if ( in_array( $root, $_path_data ) )
                    $_theme_root = $root;
            }
        }
    }
    else 
    {
        // Get rid of the leading slash
        $_theme_root = str_replace( '/', '', $theme_roots );
    }

    // Plugins basename
    $_plugin_root = basename( WP_PLUGIN_DIR );


    # >>>> get file & load data
    $base_file = '';
    // Themes
    if ( in_array( $_theme_root, $_path_data ) )
    {
        foreach ( search_theme_directories() as $folder => $data )
        {
            foreach ( $_path_data as $_path_part )
            {
                if ( $_path_part == $folder )
                    $base_file = trailingslashit( $data['theme_root'] ).$data['theme_file'];
            }
        }

        $file_data = get_theme_data( $base_file );
    }
    // Plugins
    elseif( in_array( $_plugin_root, $_path_data ) )
    {
        $plugins = get_plugins();
        foreach ( $plugins as $plugin_file => $plugin_info )
        {
            $data   = explode( '/', $plugin_file );
            $file   = $data[1];
            foreach ( $_path_data as $_path_part )
            {
                if ( $_path_part !== $file )
                    $base_file = WP_CONTENT_DIR.$_type.'/'.$data[0].'/'.$data[1];
            }
        }

        $file_data = get_plugin_data( $base_file );
    }
    // WPMU Plugins
    else
    {
        // MU plugins basename - compatible for older MU too
        // Thanks (again) to @Thomas Scholz <http://toscho.de> for the hint that mu plugins really exists
        $mu_plugin_dir = ! version_compare( $GLOBALS['wp_version'], '3.0.0', '>=' ) ? MUPLUGINDIR : WPMU_PLUGIN_DIR;
        $_mu_plugin_root = basename( $mu_plugin_dir );

        if ( ! in_array( $_mu_plugin_root, $_path_data ) )
            return false;

        $mu_plugins = get_mu_plugins();
        foreach ( $mu_plugins as $mu_plugin_file => $mu_plugin_info )
        {
            $data   = explode( '/', $mu_plugin_file );
            $file   = $data[1];
            foreach ( $_path_data as $_path_part )
            {
                if ( $_path_part !== $file )
                    $base_file = WP_CONTENT_DIR.$_type.'/'.$data[0].'/'.$data[1];
            }
        }

        $file_data = get_plugin_data( $base_file );
    }
    # <<<< get file & load data


    // return
    if ( ! empty ( $file_data ) )
        return $file_data[ $value ];

    // return false to determine that we couldn't load the comment header data
    return false;
}

Exemplo de uso:

echo $this->get_data( 'Author' ); // The Plugin or Theme Author
echo $this->get_data( 'Version' ); // The Plugin or Theme Version
echo $this->get_data( 'Name' ); // The Plugin or Theme Name
    
por kaiser 14.06.2011 / 00:09
5

Você pode obter o arquivo principal do tema usando o seguinte:

$theme_info_file = trailingslashit( get_template_directory() ) . 'style.css';

Para obter o arquivo principal do plugin, você precisa saber o nome do plugin. E então você pode usar a seguinte função:

function get_plugin_file( $plugin_name ) {
    require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
    $plugins = get_plugins();
    foreach( $plugins as $plugin_file => $plugin_info ) {
        if ( $plugin_info['Name'] == $plugin_name ) return $plugin_file;
    }
    return null;
}

Por exemplo, para obter o arquivo principal do plugin para o Akismet.

$akismet_plugin_file =  trailingslashit( WP_PLUGIN_DIR ) . get_plugin_file( 'Akismet' );
    
por Hameedullah Khan 13.06.2011 / 21:58
1

Em um projeto recente, usei o seguinte para obter o arquivo de plug-in principal & dados do meu plugin de outro arquivo dentro do meu plugin, sem ter que codificar nada:

get_plugins( '/' . explode( '/', plugin_basename( __FILE__ ) )[0] );

Isso retornará o seguinte:

array (size=1)
  'main_plugin_file.php' => 
    array (size=11)
      'Name' => string 'Plugin Name' (length=11)
      'PluginURI' => string 'http://wordpress.org/plugins/plugin-folder/' (length=41)
      'Version' => string '1.0' (length=3)
      'Description' => string 'BlaBlaBla Something awesome.' (length=148)
      'Author' => string 'Max GJ Panas' (length=12)
      'AuthorURI' => string 'http://maxpanas.com' (length=19)
      'TextDomain' => string 'plugin-name' (length=11)
      'DomainPath' => string '/languages' (length=10)
      'Network' => boolean false
      'Title' => string 'Plugin Name' (length=11)
      'AuthorName' => string 'Max GJ Panas' (length=12)

Você pode usar isso em qualquer arquivo dentro do seu plugin e ele deve funcionar bem e você não precisa se preocupar com nenhum dos arquivos sendo renomeados, caminhos alterados, etc.

Para obter o "caminho do arquivo de plug-in principal com dados de plug-in" usado por várias funções, como is_plugin_active() e is_plugin_active_for_network() , de um arquivo não o arquivo de plug-in principal, use o seguinte código:

 $plugin_dir  = explode( '/', plugin_basename( __FILE__ ) )[0];
 $plugin_file = array_keys( get_plugins( "/$plugin_dir" ) )[0];

 if ( is_plugin_active_for_network( "$plugin_dir/$plugin_file" ) ) // for example.
   // do stuff...
    
por Max G J Panas 27.11.2013 / 00:42