Вопрос или проблема
У меня есть пользовательский тип записи под названием проекты, и его архив находится по адресу /projects
. На странице архива я получаю уведомление Notice: Trying to get property of non-object
каждый раз, когда я пытаюсь получить доступ к $post
, то есть $post->post_name
. Это предполагаемое поведение? Мне просто следует принять это и всегда проверять доступность $post
перед использованием?
if (!empty($post)) {
// Сделать что-то с $post
}
Добавьте следующую строку в верхнюю часть страницы архива:
global $post;
Дело в том, что вам нужно получить доступ к глобальному объекту $post перед тем, как пытаться его использовать.
Вы пытаетесь получить значения массива, поэтому получаете ошибки. Попробуйте с WP_Query, например:
global $post;
$projects = array(
'post_type' => 'projects',
'orderby' => 'date',
'order' => 'DESC',
'post_status' => 'publish'
);
$projects1= new WP_Query( $projects );
if ( $projects1->have_posts() ) :
while ( $projects1->have_posts() ) :
$projects1->the_post();
echo $post->post_name;
endwhile;
endif;
Я бы, вероятно, просто сначала проверил, существует ли запись, чтобы избежать ошибок:
используя post_exists() WP codex
.
Ответ или решение
Для работы с глобальной переменной $post
на архивной странице пользовательского типа записи (custom post type) в WordPress, особенно когда речь идет о пользовательском типе projects
, важно правильно понимать контекст, в котором эта переменная используется. Если вы видите уведомления, например, Notice: Trying to get property of non-object
, это указывает на то, что переменная $post
не инициализирована или не содержит ожидаемого объекта в данном контексте.
1. Объяснение природы проблемы
При загрузке архивной страницы пользовательского типа записи WordPress может не инициализировать глобальный объект $post
так, как это происходит на страницах отдельных записей. Это означает, что при попытке доступа к свойствам этого объекта, например, к $post->post_name
, вы можете получить уведомление об ошибке, поскольку объект не определен.
2. Как правильно получить доступ к $post
Для решения проблемы необходимо убедиться, что глобальная переменная $post
инициализирована. Вот как это можно сделать:
global $post;
Однако в условиях архивной страницы более надежным подходом будет использование WP_Query для получения записей соответствующего типа. Это позволит вам избежать ошибок и точно контролировать, какие записи вы получаете.
3. Пример использования WP_Query
Ниже приведен пример корректного доступа к свойствам постов на архивной странице с использованием WP_Query:
global $post;
$args = array(
'post_type' => 'projects', // Укажите тип записи
'orderby' => 'date', // Сортировка по дате
'order' => 'DESC', // Убывающий порядок
'post_status' => 'publish', // Только опубликованные записи
);
$projects_query = new WP_Query($args);
if ($projects_query->have_posts()) :
while ($projects_query->have_posts()) :
$projects_query->the_post();
// Теперь здесь вы можете безопасно использовать $post
echo esc_html($post->post_name); // Выводим имя поста
endwhile;
wp_reset_postdata(); // Сброс используемых данных
else :
echo 'Нет проектов для отображения.';
endif;
4. Проверка существования поста
Если вы по-прежнему хотите использовать переменную $post
, рекомендуется предварительно проверять, существует ли объект, прежде чем к нему обращаться. Вы можете использовать функцию post_exists()
, чтобы убедиться в этом:
if (post_exists($post->ID)) {
// Логика, если пост существует
}
5. Заключение
Таким образом, при работе с архивной страницей пользовательского типа записи в WordPress стоит учитывать особенности и контекст использования глобальной переменной $post
. Рекомендуемый подход — использование WP_Query для безопасного получения записей, что значительно уменьшает вероятность возникновения ошибок и упрощает работу с данными.
Не стесняйтесь применять проверку на существование поста, чтобы сделать ваш код более безопасным и избегать предупреждений о попытках доступа к неопределенным объектам. Помните, что правильная и безопасная работа с данными не только улучшает производительность вашего сайта, но иEnhances его безопасность.