Получить содержимое записи вне цикла WordPress

10 мая 2012 г., 13:44:07
Просмотры: 72.2K
Голосов: 26

Есть ли способ получить содержимое записи вне цикла WordPress? ID записи 302, и мне нужно отобразить её содержимое на другой странице.

1
Комментарии

Не знаете ID? Используйте get_queried_object_id()! https://developer.wordpress.org/reference/classes/wp_query/get_queried_object_id/

jave.web jave.web
12 апр. 2016 г. 19:13:52
Все ответы на вопрос 11
3
45

Вы можете использовать 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;
10 мая 2012 г. 14:15:47
Комментарии

Работают ли шорткоды при использовании этого?

Tim Baas Tim Baas
20 февр. 2014 г. 23:35:35

Только что выяснил, что нет. Сначала используйте setup_postdata( $post );, после этого можно использовать the_content();

Tim Baas Tim Baas
20 февр. 2014 г. 23:39:28

Вы можете просто выполнить apply_filters( 'the_content', $post_object->post_content );

Nathan Powell Nathan Powell
1 мар. 2017 г. 09:30:10
3

чтобы получить содержимое записи вне цикла, можно написать что-то вроде этого

global $post;
$content = $post->post_content;

if ( !empty( $content ) ) :
    echo $content;
endif;
14 сент. 2014 г. 18:40:41
Комментарии

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

dtw dtw
7 июн. 2023 г. 12:37:23

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

Aamer Shahzad Aamer Shahzad
12 июн. 2023 г. 10:15:24

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

Если ваш код выполняется на странице до начала цикла, какую запись вернет $post?

Кроме того, автор вопроса хочет получить контент для записи, которая НЕ является текущей, поэтому в данном случае это даже не имеет смысла.

dtw dtw
13 июн. 2023 г. 14:51:32
1

Искал то же самое, удивительно, что никто не предложил этот вариант:

$pageID = 302;

echo get_the_content(null, false, $pageID);

Отлично работает! :)

4 нояб. 2020 г. 17:58:38
Комментарии

Просто, но элегантно!

Faisal Ashfaq Faisal Ashfaq
20 авг. 2021 г. 21:19:35
3

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

$post_id = 22;        
$post_object = get_post( $post_id );        
echo do_shortcode( $post_object->post_content );
23 мар. 2014 г. 19:29:33
Комментарии

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

Brad Dalton Brad Dalton
25 июн. 2015 г. 00:52:50

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

Jeff Jeff
18 апр. 2017 г. 00:35:50

Кроме того, это увеличивает связность между вашим кодом и исходным кодом шорткода. Если метод, который стоит за шорткодом, будет переименован или изменится его сигнатура, ваш код сломается.

Jeff Jeff
18 апр. 2017 г. 00:37:21
1

Для полноты картины, развивая комментарий Тима выше и вдохновляясь статьёй Стивена Харриса, решение, которое позволяет использовать the_content(), выглядит так:

$post_id = 302;
global $post;
$post = get_post($post_id);
setup_postdata( $post );
the_content();
wp_reset_postdata( $post );

Таким образом, фильтры применяются (будут добавлены абзацы и т.д.), а также работают шорткоды.

23 мая 2014 г. 10:07:01
Комментарии

Это чуть не уронило мой браузер :/ удаление амперсанда помогает, но шорткоды всё равно не обрабатываются.

Zade Zade
5 окт. 2015 г. 11:12:53
0

Как уже говорилось, вы можете использовать решение с 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 );
1 мар. 2017 г. 09:22:11
0

Если вам известен ID целевой записи (302), вам может пригодиться сокращенный синтаксис, который можно использовать вне цикла (хотя его производительность практически такая же, как и у других альтернативных методов):

echo(get_post_field('post_content',302));
25 июн. 2015 г. 00:26:56
0

Вы можете использовать функцию 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; // количество комментариев
?>
8 февр. 2016 г. 17:57:09
1
-1

Вы можете просто вызвать get_the_content(postId)

<?php echo get_the_content($postId); ?>
20 апр. 2016 г. 22:43:37
Комментарии

На самом деле, это невозможно. Первый аргумент предназначен для контента, когда есть ссылка "подробнее": https://codex.wordpress.org/Function_Reference/get_the_content

joshcanhelp joshcanhelp
25 авг. 2017 г. 01:40:31
3
-2

Используйте 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 вашей записи.. Надеюсь, это сработает.

4 апр. 2015 г. 09:20:21
Комментарии

Никогда не используйте query_posts, если только вам не нужно нарушить функциональность страницы. Всегда используйте WP_Query или get_posts для пользовательских запросов :-)

Pieter Goosen Pieter Goosen
4 апр. 2015 г. 09:55:33

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

Jahirul Islam Mamun Jahirul Islam Mamun
5 апр. 2015 г. 22:23:31

Есть также фильтр pre_get_posts и the_post. Столько деталей.

Nathan Powell Nathan Powell
1 мар. 2017 г. 09:35:36
0
-3

вы можете поместить контент в категорию X и использовать query_posts перед циклом следующим образом:

    <?php query_posts('cat=X&showposts=1'); ?>
    <?php while (have_posts()) : the_post(); ?>
          <?= get_the_content(); ?>
    <?php endwhile; ?>
10 мая 2012 г. 14:20:49