web-dev-qa-db-fra.com

Thème personnalisé: Alternatives à la longue liste de 'include' dans functions.php

Je construis un thème personnalisé pour une utilisation interne uniquement. J'ai commencé par intégrer un grand nombre de fonctions de base dans les plug-ins, mais cela semblait ridicule, car elles ne nécessitent aucune interaction de l'utilisateur.

Ensuite, je mets toutes mes classes dans différents fichiers php dans mon dossier de thème et include toutes dans functions.php.

Y a-t-il une meilleure manière de faire cela?

1
ibhhvc

Comme @toscho l'a mentionné dans son commentaire, votre meilleur choix est probablement un autochargeur de quelque sorte ...

foreach ( glob( plugin_dir_path( __FILE__ ) . "subfolder/*.php" ) as $file ) {
    include_once $file;
}

Il y a des plugins qui font ce genre de chose ou possilby quelque chose comme des extraits de code , mais je vais ajouter quelques exemples ci-dessous ...


Exemple pour les fonctions de base dans des fichiers séparés dans un plugin:

Cet exemple vous permet d'ajouter et de supprimer facilement des fonctionnalités à l'aide de theme-support. Donc, fondamentalement, dans votre functions.php, vous pouvez ceci ....

add_theme_support( feature-one );
add_theme_support( feature-two );
add_theme_support( feature-three );

Créez un plugin de base avec la structure suivante:

plugin-name/
    ├── plugin-name.php
    ├── features/feature-one.php
    ├── features/feature-two.php
    ├── features/feature-three.php
    └── features/feature-four.php

Dans plugin-name.php include this code:

<?php
/*
Plugin Name:        My Themename Addons
Plugin URI:         https://example.com/
Description:        Add Themename support
Version:            1.0.0
Author:             bryanwillis
Author URI:         https://github.com/bryanwillis/
License:            MIT License
License URI:        http://opensource.org/licenses/MIT
*/

function mytheme_autoload_files() {
  global $_wp_theme_features;
  foreach (glob(__DIR__ . '/theme-support/*.php') as $file) {
    $feature = 'mytheme-' . basename($file, '.php');
    if (isset($_wp_theme_features[$feature])) {
      require_once $file;
    }
  }
}
add_action('after_setup_theme', 'mytheme_autoload_files', 100);



Deuxième exemple avec des fonctions dans des dossiers séparés (comme des plugins complets):

Cet exemple n'a pas la possibilité de supprimer des fonctionnalités à la volée, mais il charge automatiquement tout ...

  1. Ajoutez un dossier dans votre thème appelé theme-plugins.
  2. Créez un fichier appelé autoloader.php dans le dossier theme-plugins avec le code ci-dessous et utilisez include/require/etc. dans votre functions.php pour l'inclure (vous pouvez aussi en faire un plugin).
  3. Déposez vos plugins dans le dossier theme-plugins pour les charger automatiquement (les plugins doivent porter le même nom de dossier que le nom de fichier).

Structure du dossier:

themename/
 └── theme-plugins/
    ├── autoloader.php
    ├── plugin-one/plugin-one.php
    ├── plugin-two/plugin-two.php
    ├── plugin-three/plugin-three.php
    └── plugin-foo/plugin-foo.php

Code pour autoloader.php:

 <?php
/**
 * Autoloader - theme-plugins/autoloader.php
 */
 function themename_plugins_autoloader() {
    $plugins_dirs =  = array_filter( scandir() );
    $non_dirs = array(
        '.',
        '..',
        '.DS_Store',
    );
    for( $i = 0; $i < count( $non_dirs ); $i++ ) {
        $not_dir_key = array_search( $non_dirs[ $i ], $$autoload_plugin_dirs );
        if( $not_dir_key !== false ) {
            unset( $$autoload_plugin_dirs[ $not_dir_key ] );
        }
        unset( $not_dir_key );
    }
    unset( $non_dirs );
    if( empty( $$autoload_plugin_dirs ) ) {
        return;
    }
    sort( $$autoload_plugin_dirs );
    foreach( $$autoload_plugin_dirs as $dir ) {
        $plugin_dir = plugin_dir_path( __FILE__ ) . $dir;
        $plugin_file = trailingslashit( $plugin_dir ) . $dir . '.php';
        if( is_dir( $plugin_dir ) && file_exists( $plugin_file ) ) {
            require_once( $plugin_file );
        }
        unset( $plugin_file, $plugin_dir );
    }
}
themename_plugins_autoloader();
1
Bryan Willis

Je stocke les fonctions principales dans un thème parent, puis charge les fonctions spécifiques au site dans un thème enfant.

Avantages:

  1. Désencombrer le thème (enfant) avec un code qui ne change presque jamais selon les préférences internes.
  2. Possibilité d'insérer de nouvelles fonctionnalités principales dans de nombreuses installations en mettant simplement à jour le thème parent.
0
Geoff