2015-07-15 2 views
1

Из того, что я понимаю, при разработке темы functions.php входит в каждую страницу WordPress и должен содержать всю логику тем. Wordpress тема не имеет реальную «установку» и так, если, скажем, он использует таблицу с именем my_theme_table, то часть логики внутри functions.php может бытьРоль «functions.php» на сайте WordPress

if (my_theme_table is not in db) create my_theme_table; 

Я заглянул внутрь functions.php Тематического I загружен и имеет более 6000 строк. Разве это не является крайне неэффективным для того, чтобы «логика установки», определения классов и т. Д. Читались каждый раз при загрузке страницы?

Может кто-то помочь очистить это для меня? Я пришел из фона ASP.NET, и это кажется таким странным.

+0

Добро пожаловать в Wordpress. Его ужасный беспорядок и не следует рассматривать как хороший пример PHP – PiX06

ответ

1

Из того, что я понимаю, при разработке темы, functions.php получает включен в каждом WordPress и должен содержать всю логику тем.

файл функция по теме включен в каждом запросе, но не должен содержать все логики ТЕМА. Как вы организуете файлы без шаблонов вашей темы, вам следует избегать попытки замять весь свой код в файле функций.

Я просмотрел functions.php темы, которую я загрузил, и имеет более 6000 строк.

К сожалению, для разработчиков тем очень просто сбрасывать весь свой код в файл функций и превращать его в один большой процессуальный кошмар. Не принимайте это как пример того, как все должно быть сделано.

Организуйте свои файлы тем, как и любой другой проект. Лично я люблю придерживаться 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 
}); 
+0

Если вы создаете небольшой сайт для личного портфолио, то вам действительно не нужны файлы сложной файловой структуры, не так ли? –

+1

@dingo_d Проекты меняются и растут с течением времени. Если вы потратите время на планирование и организацию своего кода, в конечном итоге у вас будет что-то гораздо менее сложное. После того, как вы изучите стандарт и как его применить, его трудно настроить даже для небольшого проекта. –

+0

Действительный пункт. Благодаря :) –

-1

functions.php содержит функции, которые перехватывают wordpress - он не должен содержать определения класса (это должно быть сделано в пользовательском плагине). С точки зрения MVC можно сказать, что functions.php - это ваш контроллер, который связывает ваши шаблоны (представления) с вашими моделями (Wordpress Core, настраиваемые плагины).

Некоторые чтения: условные теги https://codex.wordpress.org/Functions_File_Explained

+0

Почему downvote? – vard

-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 
} 
0

Ответ не связан с Wordpress или functions.php, но и с самим PHP. файл включается каждый раз, но в типичной среде он будет считываться и скомпилироваться только один раз после перезапуска, а затем кэшироваться с байтом-байтом. Поскольку PHP5.5 Zend Opimizer является частью PHP, до этого APC был очень распространенным инструментом для этого.

Таким образом, единственной проблемой остается код, который выполняется каждый раз.