web-dev-qa-db-ja.com

カスタムテーマ:functions.phpに含まれる 'include'の長いリストに代わるもの

私は社内での使用のみを目的としたカスタムテーマを作成しています。私は最初にプラグインにコア機能の多くを入れることから始めました、しかしそれからそれらが少しのユーザー相互作用も必要としないのでそれは愚かに見えました。

次に、私はすべてのクラスを私のテーマフォルダ内の異なるphpファイルに入れ、includename__それらすべてをfunctions.phpに入れます。

これを行うより良い方法はありますか?

1
ibhhvc

@toschoが彼のコメントで述べたように、あなたの最善の策はおそらくなんらかの オートローダ です...

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

このようなことコードスニペット のようなことをするプラグインがあります)、しかし私は以下のいくつかの例を追加します...


プラグイン内の別々のファイルにある基本機能の例:

この例では、テーマサポートを使用して機能を簡単に追加および削除できます。だから基本的にあなたのfunctions.phpでこれができます....

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

次の構造を持つ基本的なプラグインを作成します。

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

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



別のフォルダーに関数を持つ2番目の例(プラグイン全体のように):

この例にはその場で機能を削除するオプションはありませんが、自動的にすべてをロードします...

  1. テーマにtheme-pluginsという名前のフォルダを追加します。
  2. 以下のコードでtheme-pluginsフォルダー内にautoloader.phpというファイルを作成し、include/require/etcを使用します。それをインクルードするためにあなたのfunctions.phpに(あなたはこれをそれ自身のプラグインにすることもできます)。
  3. 自動ロードするには、プラグインをtheme-pluginsフォルダ内にドロップします(プラグインはファイル名と同じフォルダ名を持つ必要があります)。

フォルダ構造:

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

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

コア機能を親テーマに格納し、次にサイト固有の機能を子テーマにロードします。

利点:

  1. 社内の嗜好ごとに変わることがほとんどないコードを使用して、(子)テーマを整理します。
  2. 親テーマを更新するだけで、新しいコア機能を多くのインストールにプッシュする機能。
0
Geoff