Пользовательская глобальная переменная не работает в функции

Вопрос или проблема

Я уже довольно долго пытаюсь выяснить, почему моя функция не может сослаться на мою глобальную переменную.

$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, но она не инициализируется, если код для её определения не был выполнен до вызова этой функции. Убедимся, что всё правильно реализовано:

Шаги для отладки

  1. Объявление глобальной переменной: Убедитесь, что вы объявляете $my_base_url как глобальную внутри любой функции, где вы хотите его использовать.

    function getDropdown($args, $items, $all=false) {
        global $my_base_url; // Глобальная переменная
        ...
    }
  2. Инициализация переменной: Если вы хотите, чтобы переменная была доступна внутри функции, убедитесь, что вы инициализируете её до вызова функции. Ваша первичная логика инициализации $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;
    }
  3. Проверка наличия значения: Чтобы понять, почему ваша переменная $my_base_url может возвращать null, сделайте отладку на этом этапе. Вы можете использовать var_dump() или print_r() для просмотра значения переменной сразу после её присвоения.

  4. Убедитесь, что функция вызывается правильно: Когда вы вызываете getDropdown, убедитесь, что вы передаете корректные значения для $args и $items, которые потом используются в условной логике:

    echo getDropdown('your_arg', ['Item 1' => 'value1', 'Item 2' => 'value2']);

Подход с использованием отладочной информации

Если после применения всех вышеизложенных шагов вы все еще не получаете ожидаемого результата, включите отладку с помощью WP_DEBUG в вашем wp-config.php:

define('WP_DEBUG', true);

Это поможет вам увидеть все потенциальные ошибки в вашем коде.

Заключение

Ошибки с использованием глобальных переменных могут быть довольно распространены, особенно в контексте WordPress, где множество функций могут взаимодействовать друг с другом. Убедитесь, что ваше понимание области видимости переменных и принципов работы функций в PHP достаточно глубоко. В случае скачков значения переменных, отладка — ваш лучший друг, а использование глобальных переменных — это мощный инструмент, если им правильно управлять. Следуя советам, приведенным выше, вы сможете эффективно использовать глобальные переменные, что поможет вам достигнуть лучших результатов в разработке.

Оцените материал
Добавить комментарий

Капча загружается...