Obtener extracto usando get_the_excerpt fuera de un bucle
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"
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
.

@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.

@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.

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.

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.

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.

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();

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;
}

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.

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

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

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

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

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

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);
