Obtenga un extracto usando get_the_excerpt fuera de un bucle


31

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

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

if (is_singular('post')) {
  if (has_excerpt($post->ID)) {
    echo "\t<meta property='og:description' content='".esc_attr(strip_tags(get_the_excerpt($post->ID)))."' />\n";
  }else{
    echo "\t<meta property='og:description' content='". [?] ."' />\n";
  }
}else{
  echo "\t<meta property='og:description' content='".get_bloginfo('description')."' />\n";
}

Aquí, has_excerptsiempre falla y get_the_excerpt($post->ID)ya no funciona (en desuso).

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

ps: también estoy usando el complemento "Extracto avanzado"


ok, lo tengo usando my_excerpt($post->post_content, get_the_excerpt())y usando la my_excerpt()función de wordpress.stackexchange.com/questions/6961/…
ariel

3
Agregue una solución que se le ocurrió como respuesta, para que esto no persiga al sitio como una pregunta sin respuesta. :)
Rarst

Simplemente use la función the_post()(también funciona en la plantilla de publicación única) antes de llamar get_the_excerpt(), configurará los datos necesarios para usted.
Sisir

Respuestas:


29

Encontré esta pregunta al mirar cómo hacer esto sin el objeto de publicación.

Mi investigación adicional reveló esta técnica ingeniosa:

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


1
Esto debe aceptarse como respuesta, ya que es la forma recomendada de extraer datos fuera del ciclo. Tampoco requiere ninguna función personalizada o anulación de la $postvariable global.
MacK

44
devuelve una cadena vacía.
Kyaw Tun

1
@KyawTun: funciona, siempre y cuando $post_idesté configurado (¿cuál es el valor de $post_id? Y $post_ides una identificación de publicación válida y legítima.)
cale_b

2
@cale_b Gracias. Uso la consulta get_posts y obtengo ID de la matriz resultante. El objeto de publicación tiene post_title, post_content, ID, etc. Pero no funciona.
Kyaw Tun

Si necesita SOLO el TEXTO y no la etiqueta <p> que se incluye con el filtro_excerpt, utilice el filtro "get_the_excerpt", de modo que el filtro anterior se convierta en: $ text = apply_filters ('get_the_excerpt', get_post_field ('post_excerpt', $ post_id) ); esto le dará solo el texto RAW que puede insertar en cualquier parte de su propio marcado.
Mohsin

22

Como parece que ya tiene el objeto de publicación para el que necesita el extracto, puede forzar a que las cosas funcionen:

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

La setup_postdata()función globalizará el $postobjeto y lo hará disponible para la función de bucle antiguo normal. Cuando estás dentro del ciclo, llamas the_post()y configura las cosas para ti ... fuera del ciclo, debes forzarlo manualmente.


1
Esto funciona pero: "Debe pasar una referencia a la $postvariable global , de lo contrario funciona como the_title()si no funcionara correctamente". global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
Deach

setup_postdata($post);FTW !!!!
squarecandy

18

Prueba esto:

Cree una nueva función en functions.php y luego llámela desde cualquier lugar.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id); //Gets post ID
    $the_excerpt = $the_post->post_content; //Gets post_content to be used as a basis for the excerpt
    $excerpt_length = 35; //Sets excerpt length by word count
    $the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Strips tags and images
    $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 una publicación que describe el código.


1
Excelente encontrar a mi amigo. Nunca entendí por qué WordPress habría dejado de usar una función tan crítica. Esto está efectivamente reconstruyéndolo desde cero, pero funciona. Dada la frecuencia con la que usamos el extracto fuera del ciclo con características como complementos para compartir en redes sociales, probablemente debería haber seguido siendo parte del núcleo.
Ideas imperativas

1
La respuesta de EAMann es un enfoque mucho mejor para este problema, y ​​debería considerarse la mejor práctica. Este enfoque es básicamente duplicar las partes internas de Core en lugar de usar la API.
Ian Dunn



1

En caso de que no tenga el objeto de publicación, 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;
}

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

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

1

Esto es para cuando quieras usar get_the_excerpt()fuera del ciclo:

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

Esta es la forma más directa de hacerlo. Sin embargo, no estoy seguro de que sea un gran rendimiento. Todavía obtienes mi +1
Bill

1

Si desea generar el extracto automáticamente del contenido en una línea, puede usar una wp_trim_wordsfunción como esta:

// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);

-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;

Por favor, editar su respuesta , y añadir una explicación: ¿por qué podría que resolver el problema?
fuxia
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.