Ошибка: Попытка прочитать свойство “ID” у null

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

У меня ошибка Попытка прочитать свойство "ID" у null в этом фрагменте кода

global $wp_query;
$categories =  get_the_terms($wp_query->post->ID, 'live_stream_categories');
$cat_slug = '';
$live_stream_true = False;
if(!empty($categories)){
    foreach ($categories as $cat) {
        if($cat->slug != 'live-stream')
        {
            $cat_slug = $cat->slug;
        }
        if($cat->slug == 'live-stream')
        {
            $live_stream_true = True;
        }
     }
 }

Однако я не уверен, какое решение будет лучшим. Есть какие-то рекомендации? Я взял этот сайт от предыдущего разработчика

Где вы поместили эту функцию? Лучше вызвать её внутри действия, ошибка, вероятно, возникает из-за отсутствующей переменной.

add_action('init','newFunction');
function newFunction(){
 global $wp_query;
 // Делайте свой код здесь
}

Чтобы исправить эту ошибку (на php8 и выше), попробуйте следующее:

global $wp_query;
$post_id = get_queried_object_id();
$categories =  get_the_terms($wp_query->$post_id, 'live_stream_categories');
$cat_slug = '';
$live_stream_true = False;
if(!empty($categories)){
    foreach ($categories as $cat) {
        if($cat->slug != 'live-stream')
        {
            $cat_slug = $cat->slug;
        }
        if($cat->slug == 'live-stream')
        {
            $live_stream_true = True;
        }
     }
 }

Проблема возникает, если код выполняется вне основного цикла WordPress или если запрос не находит публикаций.

Вы можете сначала проверить, что $wp_query->post не равен null, прежде чем пытаться получить доступ к его свойствам. Кроме того, хорошей практикой является проверка, чтобы $wp_query сам не был null, чтобы избежать потенциальных ошибок.

global $wp_query;
if ($wp_query && $wp_query->post) {
    $categories = get_the_terms($wp_query->post->ID, 'live_stream_categories');
    $cat_slug = '';
    $live_stream_true = false;

    if (!empty($categories)) {
        foreach ($categories as $cat) {
            if ($cat->slug != 'live-stream') {
                $cat_slug = $cat->slug;
            }
            if ($cat->slug == 'live-stream') {
                $live_stream_true = true;
            }
        }
    }
} else {
    // Обработайте случай, когда нет доступной публикации
    // Например, вы можете установить значения по умолчанию или отобразить сообщение об ошибке
    $cat_slug = '';
    $live_stream_true = false;
}

Ответ или решение

Ошибка "Попытка прочитать свойство ‘ID’ у null" возникает, когда вы пытаетесь получить доступ к свойству объекта, который не инициализирован или равен null. В данном случае это происходит в коде, который использует глобальный объект $wp_query, чтобы получить идентификатор поста. Однако в некоторых ситуациях, например, если код выполняется вне основного цикла WordPress, $wp_query->post может быть равен null.

Анализ проблемы

  1. Контекст выполнения:
    Код может выполняться в разных контекстах (например, на страницах, где нет постов, или в не стандартных хуках WordPress). Если $wp_query не содержит посты, обращение к $wp_query->post->ID вызовет ошибку.

  2. Версия PHP:
    С последними версиями PHP (8 и выше) строгая проверка типов и наличие объектов становятся еще более актуальными. Это означает, что вызов свойств у null объектов приводит к ошибкам во время выполнения кода.

Решение проблемы

Чтобы избежать этой ошибки, необходимо добавить условия проверки перед доступом к свойствам объекта. Вот пример модифицированного кода с учетом проверок:

global $wp_query;

// Проверка на существование объекта $wp_query и его свойства post
if ($wp_query && $wp_query->post) {
    // Получаем ID текущего поста
    $post_id = $wp_query->post->ID;

    // Получаем категории для текущего поста
    $categories = get_the_terms($post_id, 'live_stream_categories');

    $cat_slug = '';
    $live_stream_true = false;

    // Проверка наличия категорий
    if (!empty($categories)) {
        foreach ($categories as $cat) {
            // Проверка на наличие категории 'live-stream'
            if ($cat->slug != 'live-stream') {
                $cat_slug = $cat->slug; // Запоминаем слаг категории
            }
            if ($cat->slug == 'live-stream') {
               $live_stream_true = true; // Указываем, что категория 'live-stream' присутствует
            }
        }
    }
} else {
    // Обработка случая, когда пост отсутствует
    $cat_slug = ''; 
    $live_stream_true = false; 
    // Здесь можно добавить логику, например, сообщение об отсутствии поста
}

Важные моменты

  • Проверка Параметров: Всегда проверяйте доступность объектов и их свойств перед использованием. Это предотвращает возможные ошибки и делает код более устойчивым.
  • Приемы обработки ошибок: Рассмотрите возможность добавления логики для обработки сценариев, когда постов нет, например, вывод сообщений пользователю.
  • Использование хуков: Если ваш код выполняется вне стандартного контекста WordPress, убедитесь, что он выполняется в подходящем хуке, чтобы гарантировать, что данные доступны.

Заключение

Правильная обработка объектов и их свойств поможет избежать ошибок во время выполнения и сделает ваш код более надежным. Используйте проверки и обработку ошибок для повышения качества кода и улучшения взаимодействия с пользователями вашего сайта. Это обеспечит более плавный опыт работы как для разработчиков, так и для конечных пользователей.

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

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