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"

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

cale_b
fuente
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.

EAMann
fuente
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.

Withers Davis
fuente
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
9

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

estibador
fuente
1
Esta debería ser una nueva respuesta aceptada ya que estamos en la era WP 4.5 +.
Matija Mrkaic
18
Esto no funcionará si el extracto está vacío, ya que el wp_trim_excerptfiltro devolverá el extracto de la publicación actual.
Dylan
99
Consulte core.trac.wordpress.org/ticket/36934 para obtener detalles sobre lo que dijo
@Dylan
5

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

ariel
fuente
2
Las respuestas de solo enlace no son buenas. Copie el código relevante aquí. Cuando ese enlace se rompe, ese sitio está inactivo / desaparecido, entonces esta respuesta no tiene valor.
cale_b
¡Funcionó perfectamente para mí!
Saikat
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;
}
OKParrothead
fuente
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;
}
Gixty
fuente
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);
Picard
fuente
-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;
Rinzler
fuente
Por favor, editar su respuesta , y añadir una explicación: ¿por qué podría que resolver el problema?
fuxia