Использование глобальных переменных внутри плагина
Я создаю свой первый плагин и обнаружил, что мне нужно вызывать одни и те же переменные опций в разных частях одной страницы. Поэтому я искал решение и наткнулся на глобальные переменные, которые, похоже, работают для меня. Однако, после прочтения нескольких статей, я заметил, что люди выступают против использования глобальных переменных, и я не совсем уверен, правильно ли я их использую.
Вот что у меня есть:
/************************
* Переменные
************************/
global $bClass, $cClass, $dClass, $cExpiry;
$bClass = $cClass = $dClass = $cExpiry = get_option('myoption');
Затем, поскольку я использую одну опцию для сохранения соответствующих переменных в массиве, я вывожу значение так:
jquery
expires: <?php global $cExpiry; echo $cExpiry['cExpiry']; ?>,
и затем я также использую это в других функциях на той же странице.
Это работает для меня, но я всё ещё сомневаюсь, правильно ли я это делаю.
обновление Спасибо за объяснение, ребята. В итоге я стал использовать локальные переменные и также нашел ошибку в своем коде;
Поскольку все мои переменные сохранены в одной опции, я просто использовал одну локальную переменную:
$options = get_option('myoption');
Затем я получаю доступ к массиву, помещая переменную внутри скобок:
<?php echo $options['var1']; ?>
Тогда как раньше я делал $bClass = $cClass = $dClass = $cExpiry = get_option('myoption');
, что является плохой практикой.

Есть более простые способы, чем этот. Как уже отметил @Wyck, использование глобальных переменных — плохая идея. Вот краткое объяснение и инструкции:
Почему глобальные переменные — это плохо:
1) К ним может получить доступ кто угодно и где угодно. Сначала это кажется удобным, но можно столкнуться с такой ситуацией:
// Ваш код: значение по умолчанию
global $foo;
$foo = 'bar';
// Пользовательская настройка:
global $foo;
$foo = get_option( 'baz' );
// Позже в вашем коде
if ( 'bar' === $foo )
// выполнить что-то важное
// А теперь я, конечный пользователь, делаю это в шаблоне
// или Эрни, начинающий разработчик, делает это в своём стороннем плагине:
$GLOBALS['foo'] = 42;
И внезапно ничего не работает, как ожидалось. Проще говоря: глобальные переменные можно перехватить. Они не защищены от конфликтов, и никто никогда не может быть уверен, что они содержат.
2) Теперь, когда вы знаете, что их значения могут меняться на лету, становится ясно, что они непредсказуемы. Если вы попытаетесь отследить их в IDE (например, PHPStorm, Eclipse/Aptana и т. д.), то никогда не найдёте их источник или точное место изменения... если только не потратите много времени на использование точек останова, XDebug и других инструментов.
3) Нужно ли продолжать? Думаю, нет.
Вывод: так как большинство настроек загружаются автоматически, они уже доступны на каждой странице/запросе и не требуют обёртки в глобальную переменную. Просто вызывайте get_option()
там, где это необходимо.
Как передать данные из PHP в JavaScript
Всё просто: используйте wp_localize_script()
.
Пример: (можно использовать с хуками login_enqueue_scripts
и admin_enqueue_scripts
)
add_action( 'wp_enqueue_scripts', 'wpse115840_scripts' );
function wpse115840_scripts()
{
wp_enqueue_script( 'wpse_handle', etc... );
// Вот где происходит магия:
wp_localize_script( 'wpse_handle', 'wspeObject', array(
'foo' => 'bar',
'bar' => get_option( 'baz' )
) );
}
Теперь вы можете получить доступ ко всем данным из массива wp_localize_script()
(третий аргумент) в вашем JavaScript-файле, который вы только что зарегистрировали/добавили в очередь, просто обратившись к wpseObject
. Например, следующий код выведет значение bar
:
console.log( wpseObject.foo );
А wpseObject.bar
будет содержать значение вашей настройки baz
.
