¿Cómo: obtener el archivo principal del tema / plugin?

2

Hay las funciones get_theme_data(); & get_plugin_data(); : ambos usan get_file_data(); que necesita un archivo específico como $input .

Obtuve un conjunto de clases que pueden ser utilizadas por un complemento o un tema, sin una ubicación específica. Todo funciona, pero no sé cómo determinaría qué es el plugin o archivo de tema main . Me refiero al que contiene el encabezado del comentario que contiene la información (versión, autor, etc.) sobre el tema / complemento.

    
pregunta kaiser 13.06.2011 - 20:17

3 respuestas

2

¿Cómo se obtienen los datos del encabezado de comentario de un tema O un complemento ...

... que contiene una clase específica.

Lo siguiente muestra cómo puedes eliminar una clase dentro de cualquier complemento o tema y aún así ser capaz de obtener cualquier tema o datos del complemento desde el encabezado del comentario. Esto es útil para actualizar la configuración / db-options, por ejemplo.

Usted no sabe:

  1. si es un complemento, un complemento de mu o un tema
  2. y qué tan profundamente anidada está su carpeta contenedor / tema raíz o complemento.

Notas:

  1. También funciona para los plugins de mu.
  2. Puede que no funcione si se registra un directorio de temas adicional más tarde (gracias a @toscho por la sugerencia).
  3. La prueba de rendimiento para un tema muestra 0.0042 seg. tiempo de carga en 1.000 carreras.
  4. Las siguientes funciones están destinadas a residir en una clase.
/**
 * 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;
}

Ejemplo 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
    
respondido por el kaiser 14.06.2011 - 00:09
5

Puede obtener el archivo principal del tema usando lo siguiente:

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

Para obtener el archivo principal del complemento, necesita saber el nombre del complemento. Y luego puedes usar la siguiente función:

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 ejemplo, para obtener el archivo principal del complemento para Akismet.

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

En un proyecto reciente que hice, usé lo siguiente para obtener el archivo del complemento principal & datos de mi complemento de otro archivo dentro de mi complemento, sin tener que codificar nada:

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

Esto devolverá lo siguiente:

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)

Puede usar esto en cualquier archivo dentro de su complemento y debería funcionar bien y no debería preocuparse por el cambio de nombre de los archivos, las rutas cambiadas, etc.

Para obtener la "ruta al archivo principal del complemento con los datos del complemento" que utilizan varias funciones, como is_plugin_active() y is_plugin_active_for_network() , desde un archivo que es no el archivo principal del complemento, use el siguiente 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...
    
respondido por el Max G J Panas 27.11.2013 - 00:42

Lea otras preguntas en las etiquetas