Получить содержимое записи вне цикла 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();

global $post
доступен только внутри цикла, в чем и заключается суть вопроса

Нет, эта переменная доступна и вне цикла. Это глобальная переменная, которая содержит данные текущей записи. https://codex.wordpress.org/Global_Variables

Извините, мой комментарий был недостаточно ясным. Да, это глобальная переменная, но обратите внимание, что она находится в разделе под названием "Переменные внутри цикла", где сказано: "Пока выполняется цикл, эти глобальные переменные устанавливаются и содержат информацию о текущей обрабатываемой записи."
Если ваш код выполняется на странице до начала цикла, какую запись вернет $post?
Кроме того, автор вопроса хочет получить контент для записи, которая НЕ является текущей, поэтому в данном случае это даже не имеет смысла.

Не используйте shortcode https://kovshenin.com/2013/dont-do_shortcode/

Эта страница не приводит убедительных причин избегать do_shortcode
, кроме как: "Это может быть медленно" и "Вы можете просто использовать функцию, которую вызывает шорткод." Эти причины справедливы только для самых тривиальных и простых сценариев. Они не работают, когда шорткод генерируется где-то ещё, или когда есть несколько шорткодов, или шорткоды смешаны с другим контентом и разметкой. Без убедительных причин я не согласен с утверждением избегать do_shortcode
. Это похоже на преждевременную оптимизацию.

Для полноты картины, развивая комментарий Тима выше и вдохновляясь статьёй Стивена Харриса, решение, которое позволяет использовать 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

Используйте 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
для пользовательских запросов :-)

да.. ты прав.. Можно использовать и WP_Query.. результат будет тот же..
