定制主题:替代函数.php中的长长列表‘Include’

时间:2016-01-26 作者:ibhhvc

我正在构建一个仅供内部使用的自定义主题。我一开始在插件中加入了很多核心功能,但后来这看起来很愚蠢,因为它们不需要任何用户交互。

接下来,我将所有类放在主题文件夹中的不同php文件中include 它们都有功能。php。

有没有更好的方法?

2 个回复
SO网友:Bryan Willis

正如@toscho在评论中提到的,你最好的选择可能是autoloader 某种程度上。。。

foreach ( glob( plugin_dir_path( __FILE__ ) . "subfolder/*.php" ) as $file ) {
    include_once $file;
}
有一些插件do this kind of thing 或者可能是这样的code snippets, 但我将在下面添加一些示例。。。


插件中独立文件中的基本功能示例:

此示例允许您使用主题支持轻松添加和删除功能。所以基本上在你的functions.php 你可以这样。。。。

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

Create a basic plugin with the following structure:

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

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

第二个示例,功能位于单独的文件夹中(如整个插件):此示例没有动态删除功能的选项,但它会自动加载所有内容。。。

在主题中添加一个名为theme-plugins.autoloader.php 在主题插件文件夹中包含以下代码,并在函数中使用include/require/etc。php来包含它(您也可以将其作为自己的插件)theme-plugins 要自动加载它们的文件夹(插件必须与文件名具有相同的文件夹名。Folder structure:

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 for 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();

SO网友:Geoff

我将核心函数存储在父主题中,然后将特定于站点的函数加载到子主题中。

优点:

将(儿童)主题与几乎不会改变其内部偏好的代码分离