Вопрос или проблема
Я уже довольно долго пытаюсь выяснить, почему моя функция не может сослаться на мою глобальную переменную.
$query_obj = get_queried_object();
if ( is_a($query_obj, 'WP_Term') ) {
$my_base_url = get_term_link($query_obj);
} elseif ( is_a($query_obj, 'WP_Post') ) {
$my_base_url = get_permalink();
} else {
$my_base_url = null;
}
function getDropdown($args, $items, $all=false) {
global $my_base_url;
if (isset($_GET[$args])) {
$check = $_GET[$args];
} else {
$check = null;
}
$output="<ul class=\"dropdown " . $args . '">';
if ($all == true) {
$output .= '<li class="' . ($check == null ? 'active' : null) . '"><a href="' . remove_query_arg( $args, add_query_arg( null, null ) ) . '">Все</a></li>';
}
foreach ($items as $key => $value) {
$output .= '<li' . ($check == $value ? ' class="active"' : null) .'><a href="' . esc_url( add_query_arg( $args, $value ) ) . '">' . $key . '</a></li>';
}
$output .= '</ul>';
return $output . '<p>' . $my_base_url . '</p>';
}
В return
внизу просто добавлен параграф для возврата переменной, но он получается пустым. Единственный способ, которым я смог использовать базовый URL, был передача его в качестве аргумента функции. Что я упустил?
Я попробовал использовать этот код, и для условий if мне пришлось добавить global $query_obj перед кодом, не знаю, так ли это нужно.
global $query_obj;
if ( is_a($query_obj, 'WP_Term') ) {
$my_base_url = get_term_link($query_obj);
} elseif ( is_a($query_obj, 'WP_Post') ) {
$my_base_url = get_permalink();
} else {
$my_base_url = null;
}
Это, похоже, работает должным образом. В моем WordPress возвращает только null. Но глобальная переменная $my_base_url работает нормально, когда я вызываю $global $query_obj перед условиями if.
global $query_obj;
if ( is_a($query_obj, 'WP_Term') ) {
$my_base_url = get_term_link($query_obj);
} elseif ( is_a($query_obj, 'WP_Post') ) {
$my_base_url = get_permalink();
} else {
$my_base_url="это null";
}
function ti(){
global $my_base_url;
echo '<pre>';
print_r($my_base_url);
echo '</pre>';
}
ti();
Теперь для тестирования функции мне потребуются переменные $args, $items как минимум..
Если у вас включен wp_debug в wp_config.php, эта ошибка должна появиться
define( 'WP_DEBUG', true );
.
Ответ или решение
Глобальные переменные в PHP: Отладка и использование в функциях WordPress
Когда вы работаете с глобальными переменными в PHP, особенно в контексте разработки на WordPress, может возникнуть множество проблем и недопониманий. Ваша задача — обеспечить правильное использование глобальных переменных в функциях, чтобы они работали как ожидается. Давайте рассмотрим основные моменты, которые могут помочь вам разобраться в ситуации, когда ваша глобальная переменная не доступна внутри функции.
Понимание глобальных переменных
В PHP, чтобы использовать глобальную переменную внутри функции, вы должны явно объявить её как глобальную с помощью ключевого слова global
. Это позволяет функции получить доступ к переменной, определённой вне её области видимости.
В вашем примере вы пытаетесь использовать переменную $my_base_url
внутри функции getDropdown
, но она не инициализируется, если код для её определения не был выполнен до вызова этой функции. Убедимся, что всё правильно реализовано:
Шаги для отладки
-
Объявление глобальной переменной: Убедитесь, что вы объявляете
$my_base_url
как глобальную внутри любой функции, где вы хотите его использовать.function getDropdown($args, $items, $all=false) { global $my_base_url; // Глобальная переменная ... }
-
Инициализация переменной: Если вы хотите, чтобы переменная была доступна внутри функции, убедитесь, что вы инициализируете её до вызова функции. Ваша первичная логика инициализации
$my_base_url
должны находиться в области видимости до вызова функции:global $query_obj; if ( is_a($query_obj, 'WP_Term') ) { $my_base_url = get_term_link($query_obj); } elseif ( is_a($query_obj, 'WP_Post') ) { $my_base_url = get_permalink(); } else { $my_base_url = null; }
-
Проверка наличия значения: Чтобы понять, почему ваша переменная
$my_base_url
может возвращатьnull
, сделайте отладку на этом этапе. Вы можете использоватьvar_dump()
илиprint_r()
для просмотра значения переменной сразу после её присвоения. -
Убедитесь, что функция вызывается правильно: Когда вы вызываете
getDropdown
, убедитесь, что вы передаете корректные значения для$args
и$items
, которые потом используются в условной логике:echo getDropdown('your_arg', ['Item 1' => 'value1', 'Item 2' => 'value2']);
Подход с использованием отладочной информации
Если после применения всех вышеизложенных шагов вы все еще не получаете ожидаемого результата, включите отладку с помощью WP_DEBUG
в вашем wp-config.php
:
define('WP_DEBUG', true);
Это поможет вам увидеть все потенциальные ошибки в вашем коде.
Заключение
Ошибки с использованием глобальных переменных могут быть довольно распространены, особенно в контексте WordPress, где множество функций могут взаимодействовать друг с другом. Убедитесь, что ваше понимание области видимости переменных и принципов работы функций в PHP достаточно глубоко. В случае скачков значения переменных, отладка — ваш лучший друг, а использование глобальных переменных — это мощный инструмент, если им правильно управлять. Следуя советам, приведенным выше, вы сможете эффективно использовать глобальные переменные, что поможет вам достигнуть лучших результатов в разработке.