Получить содержимое записи вне цикла WordPress
Есть ли способ получить содержимое записи вне цикла WordPress? ID записи 302, и мне нужно отобразить её содержимое на другой странице.
Вы можете использовать get_page() для получения объекта $post статической страницы:
$page_id = 302;
$page_object = get_page( $page_id );
echo $page_object->post_content;
Редактирование
Аналогично, вы можете использовать get_post() для получения объекта $post записи:
$post_id = 302;
$post_object = get_post( $post_id );
echo $post_object->post_content;
Только что выяснил, что нет. Сначала используйте setup_postdata( $post );, после этого можно использовать the_content();
Tim Baas
global $post доступен только внутри цикла, в чем и заключается суть вопроса
dtw
Нет, эта переменная доступна и вне цикла. Это глобальная переменная, которая содержит данные текущей записи. https://codex.wordpress.org/Global_Variables
Aamer Shahzad
Извините, мой комментарий был недостаточно ясным. Да, это глобальная переменная, но обратите внимание, что она находится в разделе под названием "Переменные внутри цикла", где сказано: "Пока выполняется цикл, эти глобальные переменные устанавливаются и содержат информацию о текущей обрабатываемой записи."
Если ваш код выполняется на странице до начала цикла, какую запись вернет $post?
Кроме того, автор вопроса хочет получить контент для записи, которая НЕ является текущей, поэтому в данном случае это даже не имеет смысла.
dtw
Не используйте shortcode https://kovshenin.com/2013/dont-do_shortcode/
Brad Dalton
Эта страница не приводит убедительных причин избегать do_shortcode, кроме как: "Это может быть медленно" и "Вы можете просто использовать функцию, которую вызывает шорткод." Эти причины справедливы только для самых тривиальных и простых сценариев. Они не работают, когда шорткод генерируется где-то ещё, или когда есть несколько шорткодов, или шорткоды смешаны с другим контентом и разметкой. Без убедительных причин я не согласен с утверждением избегать do_shortcode. Это похоже на преждевременную оптимизацию.
Jeff
Для полноты картины, развивая комментарий Тима выше и вдохновляясь статьёй Стивена Харриса, решение, которое позволяет использовать the_content(), выглядит так:
$post_id = 302;
global $post;
$post = get_post($post_id);
setup_postdata( $post );
the_content();
wp_reset_postdata( $post );
Таким образом, фильтры применяются (будут добавлены абзацы и т.д.), а также работают шорткоды.
Как уже говорилось, вы можете использовать решение с get_post и $post_object->post_content, но не забудьте добавить проверку перед использованием этого объекта поста:
function get_post_content( $post_id = null ) {
$post_object = get_post( $post_id );
if ( ! $post_object ) { return ''; }
//иначе
return apply_filters('the_content', $post_object->post_content);
}
echo get_post_content( $other_post_id );
Вы можете использовать функцию get_post_data() для получения данных записи вне цикла. Поместите этот код в файл functions.php
function get_post_data($postId) {
global $wpdb;
return $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID=$postId");
}
а затем добавьте этот фрагмент для большего контроля над процессом
<?php $data = get_post_data(302);
echo $data->post_date; // дата записи
echo $data->post_title; // заголовок записи
echo $data->post_content; // содержимое записи
echo $data->comment_count; // количество комментариев
?>
На самом деле, это невозможно. Первый аргумент предназначен для контента, когда есть ссылка "подробнее": https://codex.wordpress.org/Function_Reference/get_the_content
joshcanhelp
Используйте wp_reset_postdata(); - это сработает.. (отредактировано)
<?php
$args = array(
'post_type' => 'posttype',
'p' => 'post_id'
);
$the_query = new WP_Query( $args );
if( have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<?php the_content(); ?>
<?php endwhile; endif;
wp_reset_postdata();
?>
posttype может быть "post", "page" или вашим пользовательским типом записи. Здесь p=302 - это ID вашей записи.. Надеюсь, это сработает.
Никогда не используйте query_posts, если только вам не нужно нарушить функциональность страницы. Всегда используйте WP_Query или get_posts для пользовательских запросов :-)
Pieter Goosen
да.. ты прав.. Можно использовать и WP_Query.. результат будет тот же..
Jahirul Islam Mamun