ОБНОВИТЬ: Мой первоначальный вопрос был решен, но это превращается в полноценную дискуссию о том, почему бы не использовать глобальные переменные, поэтому я обновляю вопрос, чтобы отразить это. Решение было таким, <?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
как предложил @TomJNowell.
ОБНОВЛЕНИЕ 2: меня теперь есть то, что я хотел. Но я все еще использую глобальные возможности и был бы рад найти лучший способ.
Я пытаюсь установить целую кучу глобальных переменных для постоянных ссылок на категории, которые будут использоваться в разных местах моей темы. Основной причиной этого является использование как в основной навигации, так и в серии вспомогательных переходов, которые выбираются в зависимости от категории, к которой относится текущая запись. Это не тема, которую я буду выпускать для использования другими, но построен для одной очень конкретной цели.
Вот как я сейчас их создаю (я вставил только несколько переменных).
function set_global_nav_var()
{
//proposal
global $prop;
// Get the ID of a given category
$category_id_prop = get_cat_ID( 'proposal' );
// Get the URL of this category
$category_link_prop = get_category_link( $category_id_prop );
$prop = '<a href="' .esc_url( $category_link_prop ). '" title="Proposal">Proposal</a>';
//Calvinball
global $cb;
// Get the ID of a given category
$category_id_cb = get_cat_ID( 'calvinball' );
// Get the URL of this category
$category_link_cb = get_category_link( $category_id_cb );
$cb = '<a href="' .esc_url( $category_link_cb). '" title="Calvinball">Calvinball</a>';
}
add_action( 'init', 'set_global_nav_var' );
Теперь я могу сделать это в <?php global $prop; echo $prop; ?>
4 местах и получить всю ссылку на код. Когда это изменится, мне нужно только изменить его в одном месте. Я открыт для альтернатив, которые не связаны с глобальным охватом.
Ответы:
Хотя я настоятельно советую против этого, и это не ускорит процесс, ваше использование некорректно.
Когда вы пытаетесь использовать глобальный, вы должны сначала указать ключевое слово global. Вы указали его здесь при определении его значения, но за пределами этой области его необходимо повторно объявить как глобальную переменную области.
например, в functions.php:
В single.php это не будет работать:
Потому что $ hello не определено. Это, однако, будет работать:
Конечно, вы не должны делать ни того, ни другого. WordPress уже пытается кэшировать эти вещи в кеше объектов. Вы не увидите увеличения скорости при выполнении этого (вы можете увидеть незначительное снижение скорости), все, что вы получите, это дополнительная сложность и необходимость набирать много глобальных объявлений, которые не нужны.
Вам было бы лучше использовать структурированные данные, такие как объекты или внедрение зависимостей, или, в вашем случае, набор функций.
Например, здесь есть способ сделать что-то похожее через статические переменные (все еще плохо по тем же причинам, но чуть-чуть меньше и легче набирать), например
Если вы действительно хотите , чтобы сэкономить время хранения где - то данные для повторного использования, рассмотреть вопрос об использовании
WP_Cache
системы с иwp_cache_get
т.д.источник
<?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
в соответствии с вашим предложением. Благодарность!Не используйте глобальные переменные , такие простые.
Почему бы не использовать глобалы
Потому что использование глобалов затрудняет поддержание программного обеспечения в долгосрочной перспективе.
Ядро WordPress имеет много общего с глобальным использованием. Пытаясь понять, как работают основные функции, такие как
the_content
, вы внезапно понимаете, что$more
переменная не локальная, а глобальная, и вам нужно выполнить поиск по всем основным файлам, чтобы понять, когда для нее установлено значение true.Итак, что можно сделать, пытаясь остановить копирование и вставку нескольких строк кода вместо сохранения результата первого запуска в глобальном формате? Существует несколько подходов, функциональных и ООП.
Функция подсластителя. Это просто оболочка / макрос для сохранения копии / вставки
Преимущества в том, что теперь есть документация о том, что делает прежний глобал, и у вас есть очевидный момент для отладки, когда возвращаемое значение не соответствует ожидаемому.
Если у вас есть подсластитель, можно легко кэшировать результат при необходимости (делайте это, только если вы обнаружите, что выполнение этой функции занимает много времени)
Это дает вам то же поведение глобального, но с преимуществом гарантированной инициализации каждый раз, когда вы получаете к нему доступ.
Вы можете иметь похожие шаблоны с ООП. Я считаю, что ООП обычно не добавляет никакой ценности в плагины и темы, но это другое обсуждение
Это неуклюжий код, но если у вас есть несколько значений, которые вы хотели бы предварительно вычислить, потому что они всегда используются, это может быть способом. По сути, это объект, который содержит все ваши глобалы в организованном порядке. Чтобы не делать экземпляр этого объекта глобальным (вам нужен один экземпляр, в противном случае вы пересчитываете значения), вы можете использовать одноэлементный шаблон (некоторые люди утверждают, что это плохая идея, YMMV)
Мне не нравится обращаться к атрибуту объекта напрямую, поэтому в моем коде он будет деформирован еще
источник
Ваш вопрос связан с тем, как работает PHP.
Возьми $ wpdb качестве примера
$ wpdb - известная глобальная переменная.
Вы знаете, когда он будет объявлен и назначен со значениями?
Каждая страница загружена , да, каждый раз, когда вы посещаете ваш WordPress сайт.
Точно так же вы должны убедиться, что те переменные, которые вы хотите глобализировать, будут объявлены и назначены с соответствующими значениями на каждой загруженной странице.
Хотя я не дизайнер тем, я могу сказать, что after_setup_theme - одноразовый хук. он будет срабатывать только при активации темы.
Если бы я был тобой, я бы использовал init или другие хуки. Нет, на вашем месте я вообще не буду использовать глобальные переменные ...
Я действительно не очень хорошо объясняю вещи. Итак, вы должны взять книгу, если вы хотите углубиться в PHP.
источник
Вы всегда можете использовать шаблон синглтона через статические геттеры.
источник