根据我的理解,在开发主题时,functions.php
会包含在每个WordPress页面中,并且应该包含所有主题逻辑。 Wordpress主题没有真正的"安装"所以,如果它使用一个名为my_theme_table
的表,那么functions.php中的一段逻辑可能是
if (my_theme_table is not in db) create my_theme_table;
我查看了我下载的主题的functions.php
内部,它已超过 6,000行。在每次加载页面时都要读取安装逻辑",类定义等,这是非常低效的吗?
有人可以帮我解决这个问题吗?我来自ASP.NET背景,这看起来很奇怪。
答案 0 :(得分:1)
根据我的理解,在开发主题时,
functions.php
会包含在每个WordPress页面中,并且应该包含所有主题逻辑。
主题的函数文件包含在每个请求中,但它不应该包含所有主题的逻辑。如何组织主题的非模板文件取决于您,但您应该避免尝试将所有代码都插入到函数文件中。
我查看了我下载的主题的
functions.php
内部,它有超过6,000行。
不幸的是,主题开发人员将所有代码转储到函数文件中并将其转化为一个重大的程序噩梦是很常见的。不要把它作为事情应该如何完成的一个例子。
像任何其他项目一样组织主题文件。我个人喜欢在开发主题时坚持PSR standards。我的函数文件通常只包含一些常量,PSR-4 autoloader和一个初始化。例如:
// Const
define('MYPROJECT_VERSION', '1.0.3');
define('MYPROJECT_BUILD', 169);
// Autoloader (PSR-4)
// Adapted from https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md
spl_autoload_register(function ($class) {
// Project namespace
$prefix = 'MyProject\\';
// Base directory for the namespace prefix
$base_dir = __DIR__ . '/core/';
// Does the class use the namespace prefix
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
return;
}
// Get the relative class name
$relative_class = substr($class, $len);
// Replace the namespace prefix with the base directory, replace namespace
// separators with directory separators in the relative class name, append
// with .php
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
// If the file exists, require it
if (file_exists($file)) {
/** @noinspection PhpIncludeInspection */
require $file;
}
});
// Initialize
\MyProject\MyTheme::init();
// End of file
每次加载页面时都要读取“安装逻辑”,类定义等,这是非常低效吗?
如果您使用自动装带器,则只会包含您使用的课程。如果您担心PHP需要在每个请求中解析源文件,请查看OPCache。
关于“安装逻辑”,您可以分别使用after_switch_themes
和switch_themes
挂钩进行安装和卸载。
add_action('after_switch_theme', function() {
// Install
});
add_action('switch_theme', function() {
// Uninstall
});
答案 1 :(得分:0)
答案与Wordpress或functions.php无关,而与PHP本身无关。每次都包含该文件,但在典型环境中,它将在重新启动后仅读取和编译一次,然后使用字节码缓存进行高速缓存。由于PHP5.5 Zend Opimizer是PHP的一部分,因此APC是一个非常常见的工具。
因此剩下的唯一问题是每次执行的代码。
答案 2 :(得分:-1)
functions.php包含挂在wordpress上的函数 - 它不应该包含任何类定义(这应该在自定义插件中完成)。从MVC的角度来看,我们可以说functions.php是你的模板(视图)与你的模型(Wordpress Core,自定义插件)相关联的控制器。
答案 3 :(得分:-1)
使用WordPress'条件标签,全局变量,定义,类检查等。例如:
<?php
// load helper functions - always
require_once get_stylesheet_directory() . '/inc/helper-functions.php';
// load admin functions - for back-end only
if ( is_admin() )
require_once get_stylesheet_directory() . '/inc/admin-functions.php';
// load WooCommerce functions - when WooCommerce is active
if ( in_array(
'woocommerce/woocommerce.php',
apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) )
)
require_once get_stylesheet_directory() . '/inc/woocommerce-functions.php';
// load SomeClass' functions - when class SomeClass is known
if ( class_exists( 'SomeClass' ) )
require_once get_stylesheet_directory() . '/inc/someclass-functions.php';
// load debug functions - when debugging
if ( defined( 'WP_DEBUG' ) && WP_DEBUG )
require_once get_stylesheet_directory() . '/inc/debug-functions.php';
在符合某些功能的某些标准时,你也可以拯救:
add_action( 'wp_enqueue_scripts', 'wpdev_143439_enqueue_scripts' );
function wpdev_143439_enqueue_scripts() {
if (
! is_single()
|| is_singular( 'my_cpt' )
|| (
defined( 'NEVERSCRIPT' )
&& NEVERSCRIPT
)
) {
return;
}
// Enqueue some scripts here
}