Обсяг змінних тематичних змін WordPress


9

Мені потрібно створити змінну, доступ до якої можна отримати у файлах шаблонів WordPress Theme (index.php, header.php тощо). Я знаю, що визначення функцій functions.phpмістяться у файлі шаблону (у вашому шляху до теми), але для змінних такого немає.

Наприклад, мені постійно потрібно отримувати категорії в темі, тому я хотів би, щоб це було доступне з будь-якої точки моєї теми:

$categories = get_categories(); /* get_categories() is a wordpress function */ 

Таким чином я можу просто отримати доступ до виділених даних, не потребуючи їх перерозподілу кожного разу, коли мені потрібно отримати свої категорії.

На жаль, додавання цього фрагмента коду у моєму functions.phpфайлі не працює, також не робить змінну global.

Відповіді:


5

Мабуть, globalце робить трюк. Проблема полягала в тому, що моя змінна $categoriesповинна була переглянута з globalперед ним, в кожному шаблоні мені потрібно , щоб використовувати його.


2
Хтось ще знає про інтуїтивніше рішення, ніж потребувати переосмислення його як глобального у кожному файлі шаблону? Я використовую цей метод для розробки своєї теми, і це виглядає ... не на місці.

1
Дивовижний чувак, дякую! Для всіх, хто готовий до цього, хто трохи товстий, як я: У вашому файлі function.php: <? Php $ test = "Я тест!"; ?> У вашому, я не знаю, header.php: <? Php global $ test; echo $ test; ?> і ти золотий!
Домінік

Якщо це допомагає уточнити: всі файли шаблонів в WordPress викликаються require()заяви , які обгорнуті в функції: get_header(), get_footer()і т.д .; які самі є обгортками навколо функції get_template_part(). Оскільки функції PHP мають лише доступ до змінних, визначених у них, або переданих посиланням на них, якщо ви хочете використовувати змінну із загальної області (або визначити змінну та зробити її доступною у глобальному масштабі), ви повинні оголосити її насамперед із глобальним ключовим словом.
goldenapples

1

Домінік (не знаю, як додати відповідь до своєї відповіді):

визначення приймає лише скаляри, тож ви не могли це зробити define( CATS, get_categories() ); і навіть не

$categories = get_categories();
define( CATS, $categories );

В іншому випадку визначити, що працює добре, і це насправді безпечніше для скалярів (як ви можете бути впевнені, що константи не можуть бути перезаписані)


1

Я знаю, що ця справді стара, але є можливість для вдосконалення.

Вам слід розглянути можливість використання $ GLOBALS ['категорії'] замість просто глобального.

Для цього є дві причини:

  1. Нам не потрібно писати global $categories;кожен раз.
  2. Це зрозуміло, тоді ми використовуємо глобальний, а потім ні.

Розглянемо цей код:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

Тільки якщо ми ініціалізуємо глобальний стан безпосередньо перед використанням змінної, досить важко сказати, глобальна вона чи ні. І не забудьте повторити це в будь-якому з файлів шаблонів.

Для цього можна використовувати конвенції іменування, але є кращий спосіб, на мою думку.

Подумайте про використання $GLOBALS['categories'].

Нам залишається лише один раз ініціалізувати нашу змінну у function.php, не задумуючись global $categoriesзнову. І ми можемо побачити, що це глобальний.

print_r ($GLOBALS['categories']);

Випуск ефективності - це зовсім не проблема в цій ситуації. Я цитую Сару Големон ( посилання ):

Що це означає для використання масиву $ GLOBALS? Правильно, глобальне ключове слово технічно швидше. Тепер я хочу бути зрозумілим щодо однієї речі тут. Невелика швидкість, надана завдяки використанню ваших глобальних мереж як локалізованих [компільованих змінних], потрібно серйозно протистояти ремонтопридатності дивитися на ваш код за п’ять років і знати, що $ foo прийшов з глобальної сфери. something_using ($ GLOBALS ['foo']); ЗАВЖДИ буде вам зрозумілішим внизу, ніж глобальний $ foo; / * buncha-код * / something_using ($ foo); Не будьте копійчаними і нерозумними фунтами ..


0

Це також працює:

в function.php додати define('TEST', 'this is a test');
і у header.php чи будь-що іншеecho TEST;

Чи є якась перевага перфомансу одного методу над іншим?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.