Получить ID поста вне цикла: Уведомление: Попытка получить свойство не-объекта

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

Я пытаюсь получить ID поста вне цикла в functions.php, но какую ошибку я получаю: Notice: Trying to get property of non-object in functions.php on line 549

function theme_myeffecto_disable() {
  global $wp_query;
  $post_id = $wp_query->post->ID;

  $showreaction = get_post_meta( $post_id, 'post_reaction_show', true );
  $showreaction = isset($showreaction) ? $showreaction : true;
  var_dump($showreaction);
}
add_action( 'init', 'theme_myeffecto_disable', 20 );

и $showrating всегда возвращает false, независимо от того, истинно это или ложно 🙁

Вы не можете получить ID поста в хуке init. Первый безопасный хук для получения ID поста – это template_redirect.

Смотрите этот ответ для получения более подробной информации:

вы можете просто добавить это в ваш шаблон

<?php
 global $post;

if($post >= 1) {
echo $post->ID;
}
?>

или если вы хотите это в вашем functions.php и использовать в любом месте

function get_my_post_id() {

  global $post;

   if($post >= 1) {
    echo $post->ID;
}
}

add_shortcode( 'post_id', 'get_my_post_id' );

// затем добавьте шорткод в ваш шаблонный файл, где вы хотите вывести post_id
<?php echo do_shortcode('[post_id]'); ?> 

Ризван упомянул ранее, что вы не можете использовать init хук для этого. Первый хук, который безопасен для получения ID поста – это template_redirect. Здесь вы можете увидеть детали. Я использовал get_queried_object_id(), чтобы получить текущий ID поста.

add_action('template_redirect', function () {
    $post_id = get_queried_object_id();
    // если ID поста доступен, это не выполнится на архивных страницах.
    if ($post_id) {
        $showreaction = get_post_meta($post_id, 'post_reaction_show', true);
        $showreaction = isset($showreaction) ? $showreaction : true;
        var_dump($showreaction);
    }
});

.

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

Получение ID поста вне цикла: Ошибка "Notice: Trying to get property of non-object"

При разработке на WordPress часто возникает необходимость получения ID текущего поста вне основного цикла. Однако, как показывает ваш пример кода, реализация этого может приводить к ошибке:

Notice: Trying to get property of non-object in functions.php on line 549

Причина ошибки

Ошибка возникает из-за того, что в вашем коде вы пытаетесь получить доступ к свойству объекта $wp_query, который в хуке init может не содержать нужный объект поста. Как правило, к моменту вызова init не был еще установлен основной объект поста, поэтому попытка обращения к $wp_query->post->ID возвращает "некорректный объект".

Правильный подход

Самый безопасный способ получить ID поста – это использовать хук template_redirect, который вызывается после того, как объект поста был корректно установлен. Кроме того, для получения ID поста можно использовать функцию get_queried_object_id().

Решение

Вот исправленный код, который корректно получает ID поста:

add_action('template_redirect', function () {
    $post_id = get_queried_object_id(); // Получаем ID текущего поста.

    if ($post_id) { // Проверяем, есть ли ID поста.
        $showreaction = get_post_meta($post_id, 'post_reaction_show', true);
        $showreaction = isset($showreaction) ? $showreaction : true; // Устанавливаем значение по умолчанию.
        var_dump($showreaction); // Выводим результат для отладки.
    }
});

Как это работает

  • get_queried_object_id(): Эта функция возвращает ID текущего поста или страницы, что делает ее идеальным вариантом для получения нужной информации вне цикла.
  • template_redirect: Хук, вызываемый перед тем, как WordPress перенаправляет браузер на вывод страницы, что делает его безопасной точкой для доступа к информации о посте.

Альтернативный способ: Использование шорткода

Если вам необходимо создать шорткод для вывода ID поста непосредственно в шаблоне, следуйте следующему коду:

function get_my_post_id() {
    global $post;

    if ($post && $post->ID) { // Проверяем, существует ли объект поста.
        return $post->ID; // Возвращаем ID поста.
    }

    return null; // Возвращаем null, если ID не найден.
}

add_shortcode('post_id', 'get_my_post_id');

// В шаблоне используйте шорткод для вывода поста:
echo do_shortcode('[post_id]');

Заключение

Обязательно учитывайте, что метод, который вы используете для получения ID текущего поста, обязан соответствовать контексту выполнения кода в WordPress. Использование хука template_redirect или функции get_queried_object_id() – это надежные способы избежать ошибок и гарантировать корректный доступ к информации о посте.

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

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