it-swarm.com.de

Gewusst wie: Haupt-Plugin/Theme-Datei abrufen?

Es gibt die Funktionen get_theme_data(); & get_plugin_data(); - beide verwenden get_file_data();, für die eine bestimmte Datei als $input erforderlich ist.

Ich habe eine Reihe von Klassen, die von einem Plugin oder einem Thema verwendet werden können, ohne einen bestimmten Ort. Alles funktioniert, aber ich weiß nicht, wie ich bestimmen würde, was die Haupt- Plugin- oder Themendatei ist - ich meine die, die den Kommentarkopf enthält, der enthält die Informationen (Version, Autor, etc.) zum Theme/Plugin.

2
kaiser

Wie bekomme ich die Kommentarkopfdaten eines Themes OR Plugin ...

... das hält eine bestimmte Klasse.

Im Folgenden wird gezeigt, wie Sie eine Klasse in ein Plugin oder Thema einfügen und dennoch alle Themen- oder Plugin-Daten aus der Kommentarkopfzeile abrufen können. Dies ist beispielsweise nützlich, um Einstellungen/DB-Optionen zu aktualisieren.

Sie wissen nicht :

  1. ob es ein Plugin, ein Mu-Plugin oder ein Theme ist
  2. und wie tief verschachtelt Ihr Container/Root-Theme oder Plugin-Ordner ist.

Anmerkungen:

  1. Funktioniert auch für Mu-Plugins.
  2. Funktioniert möglicherweise nicht, wenn später ein zusätzliches Themenverzeichnis registriert wurde (danke an @toscho für den Hinweis).
  3. Der Leistungstest für ein Thema zeigt 0,0042 Sek. Ladezeit auf 1.000 Läufen.
  4. Die folgenden Funktionen sollen sich in einer Klasse befinden.

/**
 * 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;
}

Anwendungsbeispiel:

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
2
kaiser

Sie können die Hauptdatei des Themas folgendermaßen abrufen:

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

Um die Hauptdatei des Plugins zu erhalten, müssen Sie den Namen des Plugins kennen. Und dann können Sie folgende Funktion verwenden:

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

Zum Beispiel, um die Plugin-Hauptdatei für Akismet zu erhalten.

$akismet_plugin_file =  trailingslashit( WP_PLUGIN_DIR ) . get_plugin_file( 'Akismet' );
5

In einem kürzlich durchgeführten Projekt habe ich Folgendes verwendet, um die Haupt-Plugin-Datei und die Daten meines Plugins aus einer anderen Datei in meinem Plugin abzurufen, ohne dass ich irgendetwas fest codieren muss:

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

Dies gibt Folgendes zurück:

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)

Sie können dies in jeder beliebigen Datei in Ihrem Plugin verwenden. Es sollte einwandfrei funktionieren und Sie sollten sich keine Gedanken darüber machen müssen, ob Dateien umbenannt, Pfade geändert usw. werden.

Den "Pfad zur Haupt-Plugin-Datei mit Plugin-Daten", der von verschiedenen Funktionen wie is_plugin_active() und is_plugin_active_for_network() verwendet wird, aus einer Datei abrufen, die nicht die Hauptdatei ist Plugin-Datei, verwenden Sie den folgenden Code:

 $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...
1
Max G J Panas