Usar the_content fuera del bucle en WordPress

30 abr 2014, 23:00:20
Vistas: 14.5K
Votos: 2

Estaba intentando obtener las primeras 100 palabras del contenido en el encabezado, y uso el siguiente fragmento para obtener las primeras 100 palabras dentro del bucle, pero ¿es posible obtener el valor fuera del bucle?:

$cstring = get_the_content( '' );
$newcString = substr( $cstring, 0, 100 );
echo'<p>' . $newcString . '</p>';
0
Todas las respuestas a la pregunta 4
4

Escribí un artículo sobre esto aquí, pero aquí hay un resumen de los puntos:

  • the_content solo se puede usar 'dentro del bucle'
  • 'dentro del bucle' solo se puede 'simular' correctamente llamando a setup_postdata() y global $post.
  • Luego necesitas limpiar después de ti mismo llamando a wp_reset_postdata()

El siguiente código proporciona una función para recuperar el contenido del post desde el ID del post. Difiere de la respuesta de @NickYoung en que el contenido que recibes no es lo que está almacenado en la columna post_content de la tabla posts, sino ese contenido después de haber pasado por el filtro the_content (por ejemplo, shortcodes parseados, etc.).

El código

/**
 * Muestra el contenido del post. Opcionalmente permite pasar el ID del post
 * @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 Opcional. ID del post.
 * @param string $more_link_text Opcional. Contenido para cuando hay más texto.
 * @param bool $stripteaser Opcional. Elimina el contenido del teaser antes del texto 'more'. Por defecto es 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 may 2014 13:28:22
Comentarios

Ese es un buen punto sobre que no está filtrado. En ese caso podrías usar $post->post_content_filtered, ¿verdad? Nunca he usado esa versión antes pero parece que también serviría.

Nick Young Nick Young
6 may 2014 00:14:08

Así es. $post->post_content no pasa por los filtros.

bysanchy bysanchy
26 oct 2016 07:38:49

Esta debería ser la respuesta aceptada.

Christine Cooper Christine Cooper
20 mar 2018 14:27:38

wp_reset_postdata( ) no acepta ningún parámetro. Quizás lo hacía antes, no lo sé.

Felipe Alameda A Felipe Alameda A
24 jul 2019 04:34:34
0

Si estás intentando hacerlo para la página actual en la que te encuentras, puedes simplemente usar esto:

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

Esto obtendrá el contenido de la entrada actual en lugar de tener que establecer el ID específicamente.

30 abr 2014 23:36:50
5

Puedes usar get_page() o get_post() para obtener contenido fuera del bucle (loop)

//Para página
$page_id = 1;
$get_page_object = get_page( $page_id );
$page_object = $get_page_object->post_content;
echo $newpagecString = substr($page_object, 0, 100);
//Para entrada (post)
$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 abr 2014 23:05:46
Comentarios

¿Y por qué hay un $get_page_object si no lo estamos llamando en ningún lugar?

Hardeep Asrani Hardeep Asrani
30 abr 2014 23:13:30

He actualizado mi respuesta. Por favor verifícalo ahora

Maidul Maidul
30 abr 2014 23:15:17

¿Y $post_id = 2; es el ID de la publicación actual? ¿Podemos llamarlo con $post_id = $wp_query->post->ID;?

Hardeep Asrani Hardeep Asrani
30 abr 2014 23:16:41

$post_id es el ID de esa publicación de la que quieres recuperar datos. $wp_query->post->ID; funcionará en el bucle. Pero creo que querías obtener el contenido de una página o publicación desde fuera del bucle.

Maidul Maidul
30 abr 2014 23:21:25

Sí, pero aún no funciona en mi caso. Déjame ver qué está mal con mi código.

Hardeep Asrani Hardeep Asrani
30 abr 2014 23:22:33
0

Descubrí que esto funciona mejor: - usando get_the_content()

Ejemplo:

$content = apply_filters( 'the_content', get_the_content() );
echo $content;
5 dic 2022 09:37:41