Вопрос или проблема
Я пытаюсь получить 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()
– это надежные способы избежать ошибок и гарантировать корректный доступ к информации о посте.