Использование the_content вне цикла

30 апр. 2014 г., 23:00:20
Просмотры: 14.5K
Голосов: 2

Я пытался получить первые 100 слов контента в шапке сайта и использовал следующий код для получения первых 100 слов в цикле, но возможно ли получить это значение вне цикла:

$cstring = get_the_content( '' );
$newcString = substr( $cstring, 0, 100 );
echo'<p>' . $newcString . '</p>';
0
Все ответы на вопрос 4
4

Я написал статью на эту тему здесь, но вот краткое содержание основных моментов:

  • the_content можно использовать только «внутри цикла»
  • «внутри цикла» можно корректно «симулировать» только вызовом setup_postdata() и global $post.
  • После этого необходимо очистить данные, вызвав wp_reset_postdata()

Приведённый ниже код предоставляет функцию для получения содержимого записи по её ID. Он отличается от ответа @NickYoung тем, что полученное содержимое — это не то, что хранится в колонке post_content таблицы posts, а скорее то содержимое, которое прошло через фильтр the_content (например, с обработанными шорткодами и т.д.).

Код

/**
 * Отображает содержимое записи. Опционально позволяет передать ID записи
 * @uses the_content()
 * @link http://stephenharris.info/get-post-content-by-id/
 * @link https://wordpress.stackexchange.com/questions/142957/use-the-content-outside-the-loop
 * @param int $id Опционально. ID записи.
 * @param string $more_link_text Опционально. Текст для ссылки "Читать далее".
 * @param bool $stripteaser Опционально. Удалять тизерный контент перед текстом "Читать далее". По умолчанию false.
 */
function sh_the_content_by_id( $post_id=0, $more_link_text = null, $stripteaser = false ){
    global $post;
    $post = get_post($post_id);
    setup_postdata( $post, $more_link_text, $stripteaser );
    the_content();
    wp_reset_postdata( $post );
}
4 мая 2014 г. 13:28:22
Комментарии

Хорошее замечание, что контент не фильтруется. В таком случае, можно использовать $post->post_content_filtered, верно? Я раньше не использовал этот вариант, но похоже, что он тоже подойдет.

Nick Young Nick Young
6 мая 2014 г. 00:14:08

Отличное решение. $post->post_content не проходит через фильтры

bysanchy bysanchy
26 окт. 2016 г. 07:38:49

Этот ответ должен быть принятым.

Christine Cooper Christine Cooper
20 мар. 2018 г. 14:27:38

wp_reset_postdata( ) не принимает никаких параметров. Возможно, раньше принимал, но я не уверен.

Felipe Alameda A Felipe Alameda A
24 июл. 2019 г. 04:34:34
0

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

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

Этот код получает содержимое текущей записи, без необходимости явного указания ID.

30 апр. 2014 г. 23:36:50
5

Вы можете использовать get_page() или get_post() для получения контента вне цикла

// Для страницы
$page_id = 1;
$get_page_object = get_page( $page_id );
$page_object = $get_page_object->post_content;
echo $newpagecString = substr($page_object, 0, 100);
// Для записи
$post_id = 2;
$get_post_object = get_post( $post_id );
$post_object = $get_post_object->post_content;
echo $newpostcString = substr($post_object, 0, 100);
30 апр. 2014 г. 23:05:46
Комментарии

И зачем нужен $get_page_object, если мы его нигде не вызываем?

Hardeep Asrani Hardeep Asrani
30 апр. 2014 г. 23:13:30

Я обновил свой ответ. Пожалуйста, проверьте теперь

Maidul Maidul
30 апр. 2014 г. 23:15:17

А $post_id = 2; — это ID текущей записи? Может, стоит использовать $post_id = $wp_query->post->ID; ?

Hardeep Asrani Hardeep Asrani
30 апр. 2014 г. 23:16:41

$post_id - это идентификатор записи, данные которой вы хотите получить. $wp_query->post->ID; будет работать внутри цикла. Но я думаю, вы хотели получить содержимое страницы или записи вне цикла.

Maidul Maidul
30 апр. 2014 г. 23:21:25

Да, но в моем случае это все равно не работает. Давайте посмотрим, что не так с моим кодом.

Hardeep Asrani Hardeep Asrani
30 апр. 2014 г. 23:22:33
0

Я обнаружил, что это работает лучше: - используя get_the_content()

Пример:

$content = apply_filters( 'the_content', get_the_content() );
echo $content;
5 дек. 2022 г. 09:37:41