WordPressテーマのfunctions.phpファイルでコードを整理しますか?
8 回答
- 投票
-
- 2010-09-06
テーマの
functions.php
のコードが圧倒され始めている場合は、複数のファイルに分割することを検討する準備ができていると思います.私はこの時点でほとんど第二の性質によってそれをする傾向があります.テーマの
functions.php
ファイルにインクルードファイルを使用するテーマディレクトリの下に "includes" というサブディレクトリを作成し、コードをその時点で意味のあるものごとに整理されたインクルードファイルに分割します(つまり、コードを常にリファクタリングして移動しています)また、サイトが進化するにつれて、実際のコードを
functions.php
に配置することはめったにありません.すべてがインクルードファイルに入ります.私の好みです.例を示すために、WordPressAnswersで質問への回答をテストするために使用するテストインストールを次に示します.質問に答えるたびに、再び必要になった場合に備えてコードを保持します.これは、ライブサイトで行うこととは異なりますが、コードを分割するメカニズムを示しています.
<?php /* * functions.php * */ require_once( __DIR__ . '/includes/null-meta-compare.php'); require_once( __DIR__ . '/includes/older-examples.php'); require_once( __DIR__ . '/includes/wp-admin-menu-classes.php'); require_once( __DIR__ . '/includes/admin-menu-function-examples.php'); // WA: Adding a Taxonomy Filter to Admin List for a Custom Post Type? // http://wordpress.stackexchange.com/questions/578/ require_once( __DIR__ . '/includes/cpt-filtering-in-admin.php'); require_once( __DIR__ . '/includes/category-fields.php'); require_once( __DIR__ . '/includes/post-list-shortcode.php'); require_once( __DIR__ . '/includes/car-type-urls.php'); require_once( __DIR__ . '/includes/buffer-all.php'); require_once( __DIR__ . '/includes/get-page-selector.php'); // http://wordpress.stackexchange.com/questions/907/ require_once( __DIR__ . '/includes/top-5-posts-per-category.php'); // http://wordpress.stackexchange.com/questions/951/ require_once( __DIR__ . '/includes/alternate-category-metabox.php'); // http://lists.automattic.com/pipermail/wp-hackers/2010-August/034384.html require_once( __DIR__ . '/includes/remove-status.php'); // http://wordpress.stackexchange.com/questions/1027/removing-the-your-backup-folder-might-be-visible-to-the-public-message-generate require_once( __DIR__ . '/includes/301-redirects.php');
またはプラグインを作成
関数ごとにコードのグループ化を開始し、独自のプラグインを作成する別のオプション.私の場合、テーマの
functions.php
ファイルでコーディングを開始し、コードが具体化されるまでに、ほとんどのコードをプラグインに移動しました.ただし、PHPコード編成によるパフォーマンスの大幅な向上はありません
一方、PHPファイルの構造化は、順序と保守性の作成について99%、パフォーマンスについて1%です(
.js
ファイルと.css
ファイルの整理HTTP経由のブラウザによる場合はまったく別のケースであり、パフォーマンスに大きな影響があります.)ただし、サーバー上でPHPコードをどのように編成するかは、パフォーマンスの観点からはほとんど問題になりません.そしてコード編成は個人的な好みです
最後になりましたが、コードの編成は個人的な好みです.私がコードを整理する方法を嫌う人もいますが、私がコードを整理する方法も嫌いです.好きなものを見つけてそれを使い続けますが、より多くを学び、より快適になるにつれて、戦略を時間の経過とともに進化させます.
If you are getting to the point where the code in your theme's
functions.php
is starting to overwhelm you I would definitely say you are ready to consider splitting it up into multiple files. I tend to do that almost by second nature at this point.Use Include Files in your Theme's
functions.php
FileI create a subdirectory called "includes" under my theme directory and segment my code into include files organized by what makes sense to me at the time (which means I'm constantly refactoring and moving code around as a site evolves.) I also rarely put any real code in
functions.php
; everything goes in the include files; just my preference.Just to give you an example here's my test install that I use to test my answers to questions here on WordPress Answers. Every time I answer a question I keep the code around in case I need it again. This isn't exactly what you'll do for a live site but it shows the mechanics of splitting up the code:
<?php /* * functions.php * */ require_once( __DIR__ . '/includes/null-meta-compare.php'); require_once( __DIR__ . '/includes/older-examples.php'); require_once( __DIR__ . '/includes/wp-admin-menu-classes.php'); require_once( __DIR__ . '/includes/admin-menu-function-examples.php'); // WA: Adding a Taxonomy Filter to Admin List for a Custom Post Type? // http://wordpress.stackexchange.com/questions/578/ require_once( __DIR__ . '/includes/cpt-filtering-in-admin.php'); require_once( __DIR__ . '/includes/category-fields.php'); require_once( __DIR__ . '/includes/post-list-shortcode.php'); require_once( __DIR__ . '/includes/car-type-urls.php'); require_once( __DIR__ . '/includes/buffer-all.php'); require_once( __DIR__ . '/includes/get-page-selector.php'); // http://wordpress.stackexchange.com/questions/907/ require_once( __DIR__ . '/includes/top-5-posts-per-category.php'); // http://wordpress.stackexchange.com/questions/951/ require_once( __DIR__ . '/includes/alternate-category-metabox.php'); // http://lists.automattic.com/pipermail/wp-hackers/2010-August/034384.html require_once( __DIR__ . '/includes/remove-status.php'); // http://wordpress.stackexchange.com/questions/1027/removing-the-your-backup-folder-might-be-visible-to-the-public-message-generate require_once( __DIR__ . '/includes/301-redirects.php');
Or Create Plugins
Another option it to start grouping your code by function and create your own plugins. For me I start coding in the theme's
functions.php
file and by the time I get the code fleshed out I've moved most of my code into plugins.However NO Significant Performance Gain From PHP Code Organization
On the other hand structuring your PHP files is 99% about creating order and maintainability and 1% about performance, if that (organizing
.js
and.css
files called by the browser via HTTP is a completely different case and has huge performance implications.) But how you organize your PHP code on the server pretty much doesn't matter from a performance perspective.And Code Organization is Personal Preference
And last but not least code organization is personal preference. Some people would hate how I organize code just as I might hate how they do it too. Find something you like and stick with it, but allow your strategy to evolve over time as you learn more and get more comfortable with it.
-
いい答えです.関数ファイルを分割する必要があるこの時点にたどり着きました.frunctions.phpからプラグインに移行するのがいつ便利だと思いますか.あなたはあなたの答えで言った:_私がコードを肉付けするまでに、私は私のコードのほとんどをプラグインに移した_.私はそれを完全には理解していません、あなたは肉付きでどういう意味ですか.Nice answer, I just arrived to this point where i need to split the functions file. When do you think it's handy to move from frunctions.php to a plugin. You said in your answer: _by the time I get the code fleshed out I've moved most of my code into plugins_. I do not understand that fully, what do you mean with fleshed out.
- 0
- 2011-08-16
- Saif Bechan
-
「またはプラグインを作成する」の場合は+1.具体的には、「[機能プラグイン](http://www.doitwithwp.com/create-functions-plugin/)」+1 for "or create plugins". More specifically, "[functionality plugins](http://www.doitwithwp.com/create-functions-plugin/)"
- 5
- 2012-04-18
- Ian Dunn
-
相対パスの使用は、すべての種類の設定で信頼できるとは限らないため、代わりに絶対パスを常に使用する必要がありますusing relative paths might not be reliable in all kinds of settings, absolute path should always be used instead
- 3
- 2016-09-22
- Mark Kaplun
-
@ MarkKaplun-あなたは**絶対に**正しいです.この答えを書いたので、私はそのレッスンを難しい方法で学びました.答えを更新します.これを指摘してくれてありがとう.@MarkKaplun - You are **absolutely** correct. Since I wrote this answer I learned that lesson the hard way. I am going to update my answer. Thanks for pointing this out.
- 2
- 2016-09-23
- MikeSchinkel
-
「未定義の定数__DIR__の使用-C:\ wamp \ www \ site \ wp-content \themes \mytheme \functions.phpで「__DIR__」と想定」-PHPv5.6.25およびPHPv7.0.10-できませんコメントでこのDIRを適切にフォーマットします(underscoreunderscoreDIRunderscoreunderscore)が、dirname(underscoreunderscoreFILEunderscoreunderscore)で機能しますI get "Use of undefined constant __DIR__ - assumed '__DIR__' in C:\wamp\www\site\wp-content\themes\mytheme\functions.php" - PHP v5.6.25 and PHP v7.0.10 - I can't format properly this DIR in comment (underscoreunderscoreDIRunderscoreunderscore), but it works with dirname(underscoreunderscoreFILEunderscoreunderscore)
- 0
- 2016-11-01
- Marko
-
注意: `__DIR ___`の代わりに `__DIR__`を使用する必要があります.そうしないと、内部サーバーエラー(500)が表示されます.Caution: you'd need to use `__DIR__` instead of `__DIR___`, otherwise you'll be presented with an Internal Server Error (500).
- 0
- 2017-02-13
- robro
-
@ robro-ああ、それをキャッチしてくれてありがとう!_(くそータイプミス.Grrr...)_ :-)@robro - Ah, thanks for catching that! _(Damn typos. Grrr...)_ :-)
- 0
- 2017-02-13
- MikeSchinkel
-
- 2012-10-13
遅い回答
ファイルを正しい方法で含める方法:
function wpse1403_bootstrap() { // Here we load from our includes directory // This considers parent and child themes as well locate_template( array( 'inc/foo.class.php' ), true, true ); } add_action( 'after_setup_theme', 'wpse1403_bootstrap' );
同じことがプラグインでも機能します.
正しいパスまたはURiを取得する方法
次のようなファイルシステムAPI関数も確認してください.
-
home_url()
-
plugin_dir_url()
-
plugin_dir_path()
-
admin_url()
-
get_template_directory()
-
get_template_directory_uri()
-
get_stylesheet_directory()
-
get_stylesheet_directory_uri()
- など
include/require
ディレクトリからすべてのファイルをフェッチする必要がある場合は、
を使用してください.foreach ( glob( 'path/to/folder/*.php' ) as $file ) include $file;
これにより、障害(本番環境での使用に適している可能性があります)/ロードできないファイルが無視されることに注意してください.
この動作を変更するには、開発中に別の構成を使用することをお勧めします.
$files = ( defined( 'WP_DEBUG' ) AND WP_DEBUG ) ? glob( 'path/to/folder/*.php', GLOB_ERR ) : glob( 'path/to/folder/*.php' ) foreach ( $files as $file ) include $file;
編集:OOP/SPLアプローチ
戻ってきたばかりで、この回答がますます賛成票を集めているのを見て、PHP5.3以降の世界で私が最近どのようにそれを行っているかを示すかもしれないと思いました.次の例では、
src/
という名前のテーマサブフォルダーからすべてのファイルを読み込みます.これは、メニューや画像などの特定のタスクを処理するライブラリがある場所です.すべてのファイルが読み込まれるときに、名前を気にする必要はありません.このディレクトリに他のサブフォルダがある場合、それらは無視されます.\FilesystemIterator
は、\DirectoryIterator
に対するPHP5.3 + supercedor です.どちらもPHPSPLの一部です. PHP 5.2では組み込みのSPL拡張機能をオフにすることができましたが(すべてのインストールの1%未満でオフになりました)、SPLはPHPコアの一部になりました.<?php namespace Theme; $files = new \FilesystemIterator( __DIR__.'/src', \FilesystemIterator::SKIP_DOTS ); foreach ( $files as $file ) { /** @noinspection PhpIncludeInspection */ ! $files->isDir() and include $files->getRealPath(); }
以前はPHP5.2.xをサポートしていましたが、次のソリューションを使用しました:
\FilterIterator
ディレクトリのsrc/Filters
は、ファイルのみを取得します(ドットは取得しません).フォルダのポインタ)と\DirectoryIterator
を使用してループと読み込みを行います.namespace Theme; use Theme\Filters\IncludesFilter; $files = new IncludesFilter( new \DirectoryIterator( __DIR__.'/src' ) ); foreach ( $files as $file ) { include_once $files->current()->getRealPath(); }
src/Filters
はそれと同じくらい簡単でした:<?php namespace Theme\Filters; class IncludesFilter extends \FilterIterator { public function accept() { return ! $this->current()->isDot() and $this->current()->isFile() and $this->current()->isReadable(); } }
PHP5.2が廃止/EOLになったこと(および5.3も)を除けば、ゲーム内のコードとファイルが増えているという事実があるため、後者を使用してPHP5.2.xをサポートする理由はありません. .
まとめ
編集明らかに正しい方法は、
namespace dコードを使用することです.psr-4/"rel="nofollownoreferrer "> PSR-4 は、名前空間を介してすでに定義されている適切なディレクトリにすべてを配置することで自動ロードします.次に、 Composer と composer.json
を使用して依存関係を管理し、自動的にPHPオートローダーをビルドします(use \<namespace>\ClassName
を呼び出すだけでファイルを自動的にインポートします).これはPHPの世界におけるデファクトスタンダードであり、最も簡単な方法であり、 WPによってさらに事前に自動化および簡素化されています.スターター.Late answer
How to include your files the right way:
function wpse1403_bootstrap() { // Here we load from our includes directory // This considers parent and child themes as well locate_template( array( 'inc/foo.class.php' ), true, true ); } add_action( 'after_setup_theme', 'wpse1403_bootstrap' );
The same works in plugins too.
How to get the right path or URi
Also take a look at file system API functions like:
home_url()
plugin_dir_url()
plugin_dir_path()
admin_url()
get_template_directory()
get_template_directory_uri()
get_stylesheet_directory()
get_stylesheet_directory_uri()
- etc.
How to reduce the number of
include/require
If you need to fetch all files from a directory go with
foreach ( glob( 'path/to/folder/*.php' ) as $file ) include $file;
Keep in mind that this ignores failures (maybe good for production use)/not loadable files.
To alter this behavior you might want to use a different config during development:
$files = ( defined( 'WP_DEBUG' ) AND WP_DEBUG ) ? glob( 'path/to/folder/*.php', GLOB_ERR ) : glob( 'path/to/folder/*.php' ) foreach ( $files as $file ) include $file;
Edit: OOP/SPL approach
As I just came back and saw that this answer is getting more and more upvotes, I thought I might show how I'm doing it nowadays - in a PHP 5.3+ world. The following example loads all files from a themes subfolder named
src/
. This is where I have my libraries that handle certain tasks like menus, images, etc. You don't even have to care about the name as every single file gets loaded. If you have other subfolders in this directory, they get ignored.The
\FilesystemIterator
is the PHP 5.3+ supercedor over the\DirectoryIterator
. Both are part of the PHP SPL. While PHP 5.2 made it possible to turn the built in SPL extension off (below 1% of all installs did that), the SPL now is part of PHP core.<?php namespace Theme; $files = new \FilesystemIterator( __DIR__.'/src', \FilesystemIterator::SKIP_DOTS ); foreach ( $files as $file ) { /** @noinspection PhpIncludeInspection */ ! $files->isDir() and include $files->getRealPath(); }
Previously while I still supported PHP 5.2.x, I used the following solution: A
\FilterIterator
in thesrc/Filters
directory to only retrieve files (and not dot pointers of folders) and a\DirectoryIterator
to do the looping and loading.namespace Theme; use Theme\Filters\IncludesFilter; $files = new IncludesFilter( new \DirectoryIterator( __DIR__.'/src' ) ); foreach ( $files as $file ) { include_once $files->current()->getRealPath(); }
The
\FilterIterator
was as easy as that:<?php namespace Theme\Filters; class IncludesFilter extends \FilterIterator { public function accept() { return ! $this->current()->isDot() and $this->current()->isFile() and $this->current()->isReadable(); } }
Aside from PHP 5.2 being dead/EOL by now (and 5.3 as well), there's the fact that it's more code and one more file in the game, so there's no reason to go with the later and support PHP 5.2.x.
Summed up
EDIT The obviously correct way is to use
namespace
d code, prepared for PSR-4 autoloading by putting everything in the appropriate directory that already is defined via the namespace. Then just use Composer and acomposer.json
to manage your dependencies and let it auto-build your PHP autoloader (that imports automatically a file by just callinguse \<namespace>\ClassName
). That's the de-facto standard in the PHP world, the easiest way to go and even more pre-automated and simplified by WP Starter. -
- 2012-10-04
フォルダ内のファイルに関数を使用するのが好きです.このアプローチにより、新しいファイルを追加するときに新しい機能を簡単に追加できます.しかし、私は常にクラスまたは名前空間を使用して記述します.関数、メソッドなどの名前空間をより細かく制御できるようにします.
以下の小さな例.また、class * .phpに関する合意に基づく使用法
public function __construct() { $this->load_classes(); } /** * Returns array of features, also * Scans the plugins subfolder "/classes" * * @since 0.1 * @return void */ protected function load_classes() { // load all files with the pattern class-*.php from the directory classes foreach( glob( dirname( __FILE__ ) . '/classes/class-*.php' ) as $class ) require_once $class; }
テーマでは、他のシナリオをよく使用します.外部ファイルの機能をサポートIDで定義します.例を参照してください.これは、外部ファイルの機能を簡単に非アクティブ化する場合に役立ちます. WPコア関数
require_if_theme_supports()
を使用し、サポートIDがアクティブな場合にのみロードします.次の例では、ファイルをロードする前に、このサポートされているIDを行で定義しました./** * Add support for Theme Customizer * * @since 09/06/2012 */ add_theme_support( 'documentation_customizer', array( 'all' ) ); // Include the theme customizer for options of theme options, if theme supported require_if_theme_supports( 'documentation_customizer', get_template_directory() . '/inc/theme-customize.php' );
この詳細については、
このテーマのリポジトリをご覧ください. . I like to use a function to the files inside a folder. This approach makes it easy to add new features when adding new files. But I write always in class or with namespaces - give it more control about the Namespace of functions, method etc.
Below a small example; ut also useage with the agreement about the class*.php
public function __construct() { $this->load_classes(); } /** * Returns array of features, also * Scans the plugins subfolder "/classes" * * @since 0.1 * @return void */ protected function load_classes() { // load all files with the pattern class-*.php from the directory classes foreach( glob( dirname( __FILE__ ) . '/classes/class-*.php' ) as $class ) require_once $class; }
In Themes I use often a other scenario. I define the function of the externel file in a support ID, see the example. That is usefull if I will easy deactivate the feture of the externel file. I use the WP core function
require_if_theme_supports()
and he load only, if the support ID was active. In the follow example I deifned this supported ID in the line before load the file./** * Add support for Theme Customizer * * @since 09/06/2012 */ add_theme_support( 'documentation_customizer', array( 'all' ) ); // Include the theme customizer for options of theme options, if theme supported require_if_theme_supports( 'documentation_customizer', get_template_directory() . '/inc/theme-customize.php' );
You can see more of this in the repo of this theme.
-
- 2010-09-06
分割に関しては、ボイラープレートでカスタム関数を使用して、テーマディレクトリでfunctionsというフォルダーを探します.フォルダーがない場合は、フォルダーを作成します.次に、そのフォルダー(存在する場合)で見つかったすべての.phpファイルの配列を作成し、include()を実行します.それぞれに.
そうすれば、新しい機能を作成する必要があるたびに、PHPファイルをfunctionsフォルダーに追加するだけで、サイトへのコーディングについて心配する必要はありません.
<?php /* FUNCTIONS for automatically including php documents from the functions folder. */ //if running on php4, make a scandir functions if (!function_exists('scandir')) { function scandir($directory, $sorting_order = 0) { $dh = opendir($directory); while (false !== ($filename = readdir($dh))) { $files[] = $filename; } if ($sorting_order == 0) { sort($files); } else { rsort($files); } return ($files); } } /* * this function returns the path to the funtions folder. * If the folder does not exist, it creates it. */ function get_function_directory_extension($template_url = FALSE) { //get template url if not passed if (!$template_url)$template_url = get_bloginfo('template_directory'); //replace slashes with dashes for explode $template_url_no_slash = str_replace('/', '.', $template_url); //create array from URL $template_url_array = explode('.', $template_url_no_slash); //--splice array //Calculate offset(we only need the last three levels) //We need to do this to get the proper directory, not the one passed by the server, as scandir doesn't work when aliases get involved. $offset = count($template_url_array) - 3; //splice array, only keeping back to the root WP install folder (where wp-config.php lives, where the front end runs from) $template_url_array = array_splice($template_url_array, $offset, 3); //put back togther as string $template_url_return_string = implode('/', $template_url_array); fb::log($template_url_return_string, 'Template'); //firephp //creates current working directory with template extention and functions directory //if admin, change out of admin folder before storing working dir, then change back again. if (is_admin()) { $admin_directory = getcwd(); chdir(".."); $current_working_directory = getcwd(); chdir($admin_directory); } else { $current_working_directory = getcwd(); } fb::log($current_working_directory, 'Directory'); //firephp //alternate method is chdir method doesn't work on your server (some windows servers might not like it) //if (is_admin()) $current_working_directory = str_replace('/wp-admin','',$current_working_directory); $function_folder = $current_working_directory . '/' . $template_url_return_string . '/functions'; if (!is_dir($function_folder)) mkdir($function_folder); //make folder, if it doesn't already exist (lazy, but useful....ish) //return path return $function_folder; } //removed array elements that do not have extension .php function only_php_files($scan_dir_list = false) { if (!$scan_dir_list || !is_array($scan_dir_list)) return false; //if element not given, or not array, return out of function. foreach ($scan_dir_list as $key => $value) { if (!strpos($value, '.php')) { unset($scan_dir_list[$key]); } } return $scan_dir_list; } //runs the functions to create function folder, select it, //scan it, filter only PHP docs then include them in functions add_action('wp_head', fetch_php_docs_from_functions_folder(), 1); function fetch_php_docs_from_functions_folder() { //get function directory $functions_dir = get_function_directory_extension(); //scan directory, and strip non-php docs $all_php_docs = only_php_files(scandir($functions_dir)); //include php docs if (is_array($all_php_docs)) { foreach ($all_php_docs as $include) { include($functions_dir . '/' . $include); } } }
in terms of breaking it up, in my boiler plate I use a custom function to look for a folder called functions in the theme directory, if it is not there it creates it. Then is creates an array of all the .php files it finds in that folder (if any) and runs an include(); on each of them.
That way, each time I need to write some new functionality, I just add a PHP file to the functions folder, and don't have to worry about coding it into the site.
<?php /* FUNCTIONS for automatically including php documents from the functions folder. */ //if running on php4, make a scandir functions if (!function_exists('scandir')) { function scandir($directory, $sorting_order = 0) { $dh = opendir($directory); while (false !== ($filename = readdir($dh))) { $files[] = $filename; } if ($sorting_order == 0) { sort($files); } else { rsort($files); } return ($files); } } /* * this function returns the path to the funtions folder. * If the folder does not exist, it creates it. */ function get_function_directory_extension($template_url = FALSE) { //get template url if not passed if (!$template_url)$template_url = get_bloginfo('template_directory'); //replace slashes with dashes for explode $template_url_no_slash = str_replace('/', '.', $template_url); //create array from URL $template_url_array = explode('.', $template_url_no_slash); //--splice array //Calculate offset(we only need the last three levels) //We need to do this to get the proper directory, not the one passed by the server, as scandir doesn't work when aliases get involved. $offset = count($template_url_array) - 3; //splice array, only keeping back to the root WP install folder (where wp-config.php lives, where the front end runs from) $template_url_array = array_splice($template_url_array, $offset, 3); //put back togther as string $template_url_return_string = implode('/', $template_url_array); fb::log($template_url_return_string, 'Template'); //firephp //creates current working directory with template extention and functions directory //if admin, change out of admin folder before storing working dir, then change back again. if (is_admin()) { $admin_directory = getcwd(); chdir(".."); $current_working_directory = getcwd(); chdir($admin_directory); } else { $current_working_directory = getcwd(); } fb::log($current_working_directory, 'Directory'); //firephp //alternate method is chdir method doesn't work on your server (some windows servers might not like it) //if (is_admin()) $current_working_directory = str_replace('/wp-admin','',$current_working_directory); $function_folder = $current_working_directory . '/' . $template_url_return_string . '/functions'; if (!is_dir($function_folder)) mkdir($function_folder); //make folder, if it doesn't already exist (lazy, but useful....ish) //return path return $function_folder; } //removed array elements that do not have extension .php function only_php_files($scan_dir_list = false) { if (!$scan_dir_list || !is_array($scan_dir_list)) return false; //if element not given, or not array, return out of function. foreach ($scan_dir_list as $key => $value) { if (!strpos($value, '.php')) { unset($scan_dir_list[$key]); } } return $scan_dir_list; } //runs the functions to create function folder, select it, //scan it, filter only PHP docs then include them in functions add_action('wp_head', fetch_php_docs_from_functions_folder(), 1); function fetch_php_docs_from_functions_folder() { //get function directory $functions_dir = get_function_directory_extension(); //scan directory, and strip non-php docs $all_php_docs = only_php_files(scandir($functions_dir)); //include php docs if (is_array($all_php_docs)) { foreach ($all_php_docs as $include) { include($functions_dir . '/' . $include); } } }
-
* @mildfuzz *:いいトリック.個人的には、サイトを起動したときに一度簡単に実行できることをページの読み込みごとに実行するため、本番コードには使用しません.また、アンダースコアで始まるものをロードしないなど、ファイルを省略する方法を追加して、進行中の作業をテーマディレクトリに保存できるようにします.そうでなければ、いいです!*@mildfuzz*: Nice trick. I personally wouldn't use it for production code because it does for every page load what we could easily do once when we launch the site. Also, I'd add in some way to omit files, like not loading anything starting with an underscore so I could still store works in progress in the theme directory. Otherwise, nice!
- 5
- 2010-09-06
- MikeSchinkel
-
アイデアは気に入っていますが、リクエストごとに不要な読み込みが発生する可能性があることに同意します.新しいファイルが追加された場合、または特定の時間間隔で、生成される最終的なfunctions.phpファイルを何らかの種類の更新で自動的にキャッシュする簡単な方法があるかどうかはわかりませんか?love the idea but I agree this might possibly lead to unnecessary loading for each request. Any idea if there would be a simple way to have the final functions.php file being generated automatically cached with some type of update if/when new files are added or at a specific time interval?
- 0
- 2010-09-07
- NetConstructor.com
-
素晴らしいですが、柔軟性が失われます.また、攻撃者がコードをそこにドロップした場合はどうなりますか?また、インクルードの順序が重要な場合はどうなりますか?Nice but it leads to inflexibilities, also what happens if an attacker manages to drop their code in there? And what if the ordering of includes is important?
- 0
- 2010-09-07
- Tom J Nowell
-
@MikeSchinkel作業ファイルをfoo._phpと呼び、実行したいときに_phpを削除します.@MikeSchinkel I just call my working files foo._php, then drop the _php when I want it to run.
- 1
- 2010-09-10
- Mild Fuzz
-
@NetConstructor:いくつかの解決策にも興味があるでしょう.@NetConstructor: Would be interested in some sollution too.
- 0
- 2011-02-01
- kaiser
-
@kaiser、上記のフォルダ検索を実行する関数を実行しているcronスクリプトでそれを実行できると思いますが、結果をDB/テキストファイルに書き込み、その関数に基づいて負荷をかけます.これにより、未完成の作業が負荷にかかる可能性もあります.@kaiser, I suppose you could do it with cron scripts running a function that run's the above folder search but writes the results to a DB/textfile, then bases the loads on that function. This could potentially lead to unfinished work going into the load also.
- 0
- 2011-02-01
- Mild Fuzz
-
@MildFuzz:マイクはトランジェントAPIを指摘してくれました.多分それはある種の解決策の一部を得るかもしれません...@MildFuzz: Mike just pointed me at the transients API. Maybe that could get part of some sort of sollution...
- 0
- 2011-02-01
- kaiser
-
@mildfuzzによって概説されたソリューションに基づいて、ファイルまたはフォルダー(およびそのサブファイル/フォルダー)を自動インクルードアプローチに含めることから自動的に除外するための最良の方法は何だと思いますか?私の考えは、接頭辞としてアンダースコアアプローチを使用することです.そのような機能を含めるための最良のアプローチはどの適切なコードでしょうか?based on the solution outlined by @mildfuzz - what do you guys believe to be the best method to automatically exclude any file or folder (and its subfiles/folders) from being included within his auto-include approach? My thought would be to use the underscore approach as a prefix. What proper code would be the best approach to include such capabilities?
- 0
- 2012-10-10
- NetConstructor.com
-
`if(!strpos($ value、 '.php'))`を変更して、選択したシステムを含めるだけです.you just need to change `if (!strpos($value, '.php'))` to include whatever system you choose.
- 0
- 2012-10-10
- Mild Fuzz
-
- 2012-10-04
ネットワークインストールを介して、サーバーの異なる言語で約50の固有のカスタムページタイプを使用してサイトを管理しています.たくさんのプラグインと一緒に.
ある時点ですべてを分割することを余儀なくされました. 20〜30k行のコードを含む関数ファイルはまったく面白くありません.
コードベースをより適切に管理するために、すべてのコードを完全にリファクタリングすることにしました.デフォルトのワードプレスのテーマ構造は小さなサイトには適していますが、大きなサイトには適していません.
新しいfunctions.phpには、サイトを開始するために必要なものだけが含まれ、特定のページに属するものは含まれていません.
現在使用しているテーマレイアウトはMCVデザインパターンに似ていますが、手続き型コーディングスタイルです.
たとえば、メンバーページ:
page-member.php .ページの初期化を担当します.正しいajax関数などを呼び出す. MCVスタイルのコントローラー部分と同等である可能性があります.
関数-member.php .このページに関連するすべての機能が含まれています.これは、メンバーの機能を必要とする他のサーバーページにも含まれています.
content-member.php . HTML用のデータを準備します.MCVのモデルと同等である可能性があります.
layout-member.php . HTML部分.
これらの変更を行った後、開発時間は簡単に50%短縮され、製品の所有者は新しいタスクを提供するのに苦労しています. :)
I manage a site with about 50 unique custom page types in serveral different languages over a network installation. Along with a TON of plugins.
We where forced to split it all up at some point. A functions file with 20-30k lines of code is not funny at all.
We decided to completley refactor all code in order to manage the codebase better. The default wordpress theme structure is good for small sites, but not for bigger sites.
Our new functions.php only contains what is necessary to start the site, but nothing which belongs to a specific page.
The theme layout we use now is similar to the MCV design pattern, but in a procedural coding style.
For example our member page:
page-member.php. Responsible for initializing the page. Calling the correct ajax functions or similar. Could be equivialent to the Controller part in the MCV style.
functions-member.php. Contains all functions related to this page. This is also included in serveral other pages which need functions for our members.
content-member.php. Prepares the data for HTML Could be equivialent to the Model in MCV.
layout-member.php. The HTML part.
Efter we did these changes the development time have easily dropped by 50% and now the product owner have trouble giving us new tasks. :)
-
これをさらに役立つようにするには、このMVCパターンが実際にどのように機能するかを示すことを検討してください.To make this more helpful you might consider showing how this MVC pattern really works.
- 7
- 2012-10-05
- kaiser
-
私はまた、できればいくつかの詳細/さまざまな状況で、あなたのアプローチの例を見るのが好きです.このアプローチは非常に興味深いものに聞こえます.サーバーの負荷/パフォーマンスを他の人が使用している標準的な方法と比較しましたか?可能であれば、githubの例を提供してください.i would also be currious to see an example of your approach, preferably with some details/various situations. The approach sounds very interresting. Have you compared server load/performance with the standard methodology others use? do provide a github example if at all possible.
- 0
- 2012-10-10
- NetConstructor.com
-
- 2013-10-20
子テーマfunctions.phpファイルから:
require_once( get_stylesheet_directory() . '/inc/custom.php' );
From child themes functions.php file:
require_once( get_stylesheet_directory() . '/inc/custom.php' );
-
- 2012-10-04
Functions.phpで、必要なファイルを呼び出すためのより洗練された方法は次のとおりです.
require_oncelocate_template( '/inc/functions/shortcodes.php');
In functions.php, a more elegant way to call a required file would be:
require_once locate_template('/inc/functions/shortcodes.php');
-
[`locate_template()`](http://codex.wordpress.org/Function_Reference/locate_template)には3番目のパラメーターがあります…[`locate_template()`](http://codex.wordpress.org/Function_Reference/locate_template) has a third parameter …
- 4
- 2012-10-04
- fuxia
-
- 2018-08-19
@kaiser と
@mikeschinkel の回答. テーマのカスタマイズはすべて
/includes
フォルダーにあり、そのフォルダー内ではすべてがサブフォルダーに分割されています./includes/admin
true === is_admin()
とそのサブコンテンツを含めたいフォルダが
iterator_check_traversal_callback
を返すことによってfalse
で除外された場合、そのサブディレクトリは繰り返されません(またはfalse
に渡されます)/** * Require all customizations under /includes */ $includes_import_root = new \RecursiveDirectoryIterator( __DIR__ . '/includes', \FilesystemIterator::SKIP_DOTS ); function iterator_check_traversal_callback( $current, $key, $iterator ) { $file_name = $current->getFilename(); // Only include *.php files if ( ! $current->isDir() ) { return preg_match( '/^.+\.php$/i', $file_name ); } // Don't include the /includes/admin folder when on the public site return 'admin' === $file_name ? is_admin() : true; } $iterator_filter = new \RecursiveCallbackFilterIterator( $includes_import_root, 'iterator_check_traversal_callback' ); foreach ( new \RecursiveIteratorIterator( $iterator_filter ) as $file ) { include $file->getRealPath(); }
I combined @kaiser's and @mikeschinkel's answers.
I have all my customizations to my theme in a
/includes
folder and within that folder I have everything broken out into sub folders.I only want
/includes/admin
and its sub-contents to be included whentrue === is_admin()
If a folder is excluded in
iterator_check_traversal_callback
by returningfalse
then its sub-directories will not be iterated (or passed toiterator_check_traversal_callback
)/** * Require all customizations under /includes */ $includes_import_root = new \RecursiveDirectoryIterator( __DIR__ . '/includes', \FilesystemIterator::SKIP_DOTS ); function iterator_check_traversal_callback( $current, $key, $iterator ) { $file_name = $current->getFilename(); // Only include *.php files if ( ! $current->isDir() ) { return preg_match( '/^.+\.php$/i', $file_name ); } // Don't include the /includes/admin folder when on the public site return 'admin' === $file_name ? is_admin() : true; } $iterator_filter = new \RecursiveCallbackFilterIterator( $includes_import_root, 'iterator_check_traversal_callback' ); foreach ( new \RecursiveIteratorIterator( $iterator_filter ) as $file ) { include $file->getRealPath(); }
WordPressをカスタマイズすればするほど、このファイルを整理するのか、分割するのかを考え始めます.
より具体的には、管理領域にのみ適用されるカスタム機能と、公開Webサイトにのみ適用されるその他の機能が多数ある場合、すべての管理機能を独自のファイルに含めたり、グループ化したりする理由はありますか?
それらを別々のファイルに分割したり、グループ化したりすると、WordPress Webサイトが高速化される可能性がありますか、それともWordPress/PHPはis_adminコードプレフィックスを持つ関数を自動的にスキップしますか?
大きな関数ファイル(私のものは1370行の長さ)を処理するための最良の方法は何ですか.