Obtener extracto usando get_the_excerpt fuera de un bucle

24 ago 2011, 02:55:39
Vistas: 77.9K
Votos: 32

Tengo un código que llama a get_the_title() y funciona, pero get_the_excerpt() devuelve vacío. ¿Cómo puedo hacer que funcione?

Este código está dentro de un plugin llamado "WP Facebook Open Graph protocol". Aquí está la parte que quiero cambiar:

if (is_singular('post')) {
  if (has_excerpt($post->ID)) {
    // Muestra la meta etiqueta og:description con el extracto si existe
    echo "\t<meta property='og:description' content='".esc_attr(strip_tags(get_the_excerpt($post->ID)))."' />\n";
  }else{
    // Aquí debería ir el contenido alternativo
    echo "\t<meta property='og:description' content='". [?] ."' />\n";
  }
}else{
  // Muestra la descripción del sitio para páginas que no son entradas
  echo "\t<meta property='og:description' content='".get_bloginfo('description')."' />\n";
}

Aquí, has_excerpt siempre falla, y get_the_excerpt($post->ID) ya no funciona (está obsoleto).

Entonces, ¿cómo puedo mostrar el extracto allí?

PD: También estoy usando el plugin "Advanced Excerpt"

3
Comentarios

Ok, entendido. Usé my_excerpt($post->post_content, get_the_excerpt()) y la función my_excerpt() de http://wordpress.stackexchange.com/questions/6961/using-wp-trim-excerpt-to-get-the-excerpt-outside-the-loop

ariel ariel
24 ago 2011 03:44:37

Por favor agrega la solución que encontraste como respuesta, para que esto no quede como una pregunta sin responder en el sitio. :)

Rarst Rarst
12 sept 2011 00:56:46

Simplemente usa la función the_post() (funciona también en la plantilla de entrada individual) antes de llamar a get_the_excerpt(), esto configurará los datos necesarios para ti.

Sisir Sisir
18 sept 2014 19:01:20
Todas las respuestas a la pregunta 9
6
32

Encontré esta pregunta mientras buscaba cómo hacer esto sin el objeto post.

Mi investigación adicional me llevó a descubrir esta técnica ingeniosa:

$text = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_id));

18 jun 2014 18:33:10
Comentarios

Esto debería aceptarse como respuesta ya que es la forma recomendada de obtener datos fuera del bucle. Además, no requiere ninguna función personalizada ni sobrescritura de la variable global $post.

MacK MacK
16 jun 2015 19:43:21

Devuelve una cadena vacía.

Kyaw Tun Kyaw Tun
20 ene 2016 09:45:54

@KyawTun - funciona, siempre que $post_id esté establecido (¿cuál es el valor de $post_id?) Y $post_id sea un ID de publicación válido y legítimo.

random_user_name random_user_name
20 ene 2016 17:03:25

@cale_b Gracias. Utilizo la consulta get_posts y obtengo el ID del array resultante. El objeto post tiene post_title, post_content, ID, etc. Pero no funciona.

Kyaw Tun Kyaw Tun
21 ene 2016 14:30:01

Si necesitas SOLO el TEXTO y no la etiqueta <p> que se incluye con el filtro the_excerpt, entonces usa el filtro "get_the_excerpt", así que el filtro anterior se convierte en: $text = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post_id)); esto te dará solo el texto SIN FORMATEAR que puedes insertar en cualquier parte de tu propio marcado.

Muhammad Asad Muhammad Asad
20 may 2016 21:42:28

Tampoco me funciona. Recuerda: "el extracto del post. Este puede ser un extracto proporcionado por el usuario, que se devuelve sin cambios, o una versión recortada generada automáticamente basada en el conteo de palabras del contenido completo." ¿Quizás funcione para el extracto proporcionado por el usuario? Yo buscaba el extracto generado automáticamente.

Fabien Snauwaert Fabien Snauwaert
21 mar 2019 00:15:12
Mostrar los 1 comentarios restantes
2
22

Como parece que ya tienes el objeto de la publicación para la cual necesitas el extracto, puedes forzar que funcione de la siguiente manera:

setup_postdata( $post );
$excerpt = get_the_excerpt();

La función setup_postdata() globalizará el objeto $post y lo hará disponible para las funciones regulares del bucle. Cuando estás dentro del bucle, llamas a the_post() y configura las cosas por ti... fuera del bucle necesitas hacerlo manualmente.

9 jun 2012 02:06:40
Comentarios

Esto funciona pero: "Debes pasar una referencia a la variable global $post, de lo contrario funciones como the_title() no funcionarán correctamente." global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();

deach deach
20 ene 2017 01:35:47

setup_postdata($post); ¡Increíble!!!!

squarecandy squarecandy
30 abr 2017 20:48:28
2
18

Prueba esto:

Crea una nueva función en functions.php y luego llámala desde donde necesites.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id); //Obtiene el ID del post
    $the_excerpt = $the_post->post_content; //Obtiene el post_content para usarlo como base del extracto
    $excerpt_length = 35; //Establece la longitud del extracto por número de palabras
    $the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Elimina etiquetas e imágenes
    $words = explode(' ', $the_excerpt, $excerpt_length + 1);

    if(count($words) > $excerpt_length) :
        array_pop($words);
        array_push($words, '…');
        $the_excerpt = implode(' ', $words);
    endif;

    $the_excerpt = '<p>' . $the_excerpt . '</p>';

    return $the_excerpt;
}

Aquí hay un artículo que describe el código.

9 jun 2012 02:02:37
Comentarios

Excelente hallazgo, amigo. Nunca entendí por qué WordPress habría dejado obsoleta una función tan crítica. Esto efectivamente la reconstruye desde cero, pero funciona. Dada la frecuencia con la que usamos el extracto fuera del loop con funciones como plugins para compartir en redes sociales, probablemente debería haber seguido siendo parte del núcleo.

Imperative Ideas Imperative Ideas
15 may 2014 05:56:30

La respuesta de EAMann es un enfoque mucho mejor para este problema, y debería considerarse como la mejor práctica. Este enfoque básicamente duplica los internos del Core en lugar de usar la API.

Ian Dunn Ian Dunn
24 mar 2015 03:18:53
3

Ahora puedes simplemente usar la función get_the_excerpt( $postID ). Desde: WordPress 4.5.0 introdujo el parámetro $post.

20 may 2016 14:07:23
Comentarios

Esta debería ser la respuesta aceptada ya que estamos en la era de WP 4.5+.

Matija Mrkaic Matija Mrkaic
13 jun 2016 15:18:58

Esto no funcionará si el extracto está vacío ya que el filtro wp_trim_excerpt devolverá el extracto de la entrada actual.

Dylan Dylan
17 ago 2016 01:24:22

Consulta https://core.trac.wordpress.org/ticket/36934 para más detalles sobre lo que mencionó @Dylan

kraftner kraftner
14 sept 2016 10:18:21
2

lo conseguí usando my_excerpt($post->post_content, get_the_excerpt()) y utilizando la función my_excerpt() de Usar wp_trim_excerpt para obtener the_excerpt() fuera del bucle

13 sept 2011 08:44:24
Comentarios

Las respuestas que solo contienen enlaces no son buenas. Copia el código relevante aquí. Cuando ese enlace se rompa, cuando ese sitio esté caído/desaparecido, entonces esta respuesta no tendrá valor.

random_user_name random_user_name
18 jun 2014 18:23:26

¡Funcionó perfectamente para mí!

Saikat Saikat
24 jul 2017 15:19:09
2

En caso de que no tengas el objeto del post, aquí hay una función corta como la de Withers.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id);
    $the_excerpt = $the_post->post_excerpt; 
    return $the_excerpt;
}
25 nov 2012 21:28:20
Comentarios

Pero el que pregunta tiene un objeto de publicación como se indica en la pregunta.

fuxia fuxia
25 nov 2012 21:51:04

Corríjanme si me equivoco, este método devolverá el extracto manual pero no generará uno si es necesario

Bill Bill
7 nov 2014 14:46:39
1

Esto es para cuando deseas usar get_the_excerpt() fuera del bucle:

function custom_get_excerpt($post_id) {
    $temp = $post;
    $post = get_post($post_id);
    setup_postdata($post);

    $excerpt = get_the_excerpt();

    wp_reset_postdata();
    $post = $temp;

    return $excerpt;
}
1 oct 2014 02:17:27
Comentarios

Esta es la forma más directa de hacerlo... Aunque no estoy seguro de que sea la mejor en términos de rendimiento. Aún así tienes mi +1

Bill Bill
7 nov 2014 14:47:23
0

Si deseas generar el extracto automáticamente a partir del contenido en una sola línea, puedes usar la función wp_trim_words de la siguiente manera:

// 30 es el número de palabras aquí
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
15 may 2017 21:25:17
1
-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;
14 mar 2018 18:53:02
Comentarios

Por favor, [edita] tu respuesta y agrega una explicación: ¿por qué eso podría resolver el problema?

fuxia fuxia
14 mar 2018 22:25:18