apply_filters () y the_excerpt están dando resultados inesperados

10

Siento que me estoy perdiendo algo bastante obvio, aquí, pero parece que no puedo lograr que WordPress coopere.

Estoy generando etiquetas de Facebook OG con una función. Todo funciona bien, excepto el extracto.

Desde la depreciación de get_the_excerpt($post->ID), ¿hay otra forma de crear un extracto sin tener que crear un ciclo completamente nuevo? Me parece excesivo

Mi primer instinto fue usar apply_filters():

$description = apply_filters('the_excerpt', get_post($post->ID)->post_content);

Eso me da la publicación completa, completa con contenido con formato HTML. De acuerdo, debe estar equivocado. Así que probé la siguiente idea lógica:

$description = apply_filters('get_the_excerpt', get_post($post->ID)->post_content);

No dados. Ahora no hay HTML, pero sigue siendo la publicación completa (lo cual es realmente confuso).

Está bien, no hay problema. Omitamos todas las cosas elegantes y solo veamos la entrada recortada:

$description = wp_trim_excerpt(get_post($post->ID)->post_content);

Ningún cambio.

Entonces, mi pregunta es esta: ¿qué diablos está pasando? ¿Hay algo que me falta aquí?

Ingresé al núcleo de WP para encontrar cómo the_excerpt()funciona, y parece ser idéntico a mi llamada:

/**
 * Display the post excerpt.
 *
 * @since 0.71
 * @uses apply_filters() Calls 'the_excerpt' hook on post excerpt.
 */
function the_excerpt() {
    echo apply_filters('the_excerpt', get_the_excerpt());
}

Tengo algunas preguntas basadas en mis hallazgos:

  1. ¿Por qué el filtro no se aplica como se esperaba?
  2. ¿Hay alguna manera de obtener el extracto fuera del bucle sin crear un nuevo bucle?
  3. ¿Estoy loco?

Gracias de antemano por echar un vistazo. Estoy bastante perplejo, aquí.

jlengstorf
fuente
get_the_excerpt()no está en desuso, solo el parámetro adicional que solía pasarle ya no se usa.
Milo
Lo siento, a eso me refería. Gracias por aclararlo.
jlengstorf
¡Estás loco! . . . como soy yo lol
pythonian29033

Respuestas:

16

Resulta que la respuesta estaba adentro wp_trim_excerpt().

Se define en wp-includes/functions.php:1879:

/**
 * Generates an excerpt from the content, if needed.
 *
 * The excerpt word amount will be 55 words and if the amount is greater than
 * that, then the string ' [...]' will be appended to the excerpt. If the string
 * is less than 55 words, then the content will be returned as is.
 *
 * The 55 word limit can be modified by plugins/themes using the excerpt_length filter
 * The ' [...]' string can be modified by plugins/themes using the excerpt_more filter
 *
 * @since 1.5.0
 *
 * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated.
 * @return string The excerpt.
 */
function wp_trim_excerpt($text = '') {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        $text = get_the_content('');

        $text = strip_shortcodes( $text );

        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

Por lo tanto, cualquier texto pasado no se procesa; solo funciona si se llama con un parámetro vacío.

Para resolver esto, agregué un filtro rápido a mi tema que resuelve el problema:

/**
 * Allows for excerpt generation outside the loop.
 * 
 * @param string $text  The text to be trimmed
 * @return string       The trimmed text
 */
function rw_trim_excerpt( $text='' )
{
    $text = strip_shortcodes( $text );
    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]>', $text);
    $excerpt_length = apply_filters('excerpt_length', 55);
    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
    return wp_trim_words( $text, $excerpt_length, $excerpt_more );
}
add_filter('wp_trim_excerpt', 'rw_trim_excerpt');

Es algo redundante, pero me gusta más que abrir nuevos bucles cada vez que quiero generar un extracto.

jlengstorf
fuente
1
Ah, no estaba claro para mí que solo estaba buscando la operación de texto (no obteniendo datos de DB).
Hakre
Sin preocupaciones. Siempre temo no tener sentido cuando hago preguntas. Me estaba retirando de la base de datos, pero no quería abrir un bucle completo ya que tengo cosas como get_the_title($post->ID)disponibles. La última línea de código fue$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf el
Me siento realmente estúpido preguntando esto, pero ¿cómo se llama a este nuevo filtro? Lo intenté como $content = apply_filters( 'rw_trim_excerpt', $content );y $content = rw_trim_excerpt($content);, pero ninguno de estos funcionó (el primero no recortó el resultado y el posterior produjo un error).
Eric K
2
@QuantumDynamix Esto está diseñado para modificar el get_the_excerptmanejo de imitar the_excerpt, por lo que se puede llamar: apply_filters('get_the_excerpt', $content);.
jlengstorf
¡Uf! agradable desde el punto de vista de un wpress noob, gracias
pythonian29033
1

Tratar:

   get_post($post->ID)->post_excerpt
                        ^^^^^^^^^^^^

Ver: get_postCodex para todos los miembros de retorno disponibles.

hakre
fuente
44
Eso vuelve en blanco si no se ingresó ningún extracto para la publicación. Necesito imitar las acciones de get_the_excerpt () (creando un extracto si no existe ninguno).
jlengstorf
Aplicar el filtro no hará eso, por lo que está haciendo la pregunta incorrecta. No tengo idea de por qué estás buscando un extracto si no hay ninguno. get_the_excerpt()no imita eso, verifique la fuente, solo está accediendo a la variable miembro de la $postcual es post_excerpt. Ver también el enlace del códice en la respuesta.
Hakre
3
De la entrada del Codex en adelante the_excerpt: "mostrará un extracto automático que se refiere a las primeras 55 palabras del contenido de la publicación". Estoy buscando imitar ese comportamiento fuera del circuito.
jlengstorf
Bueno, cree un segundo bucle temporalmente y consulte ese archivo por su id, probablemente para una solución rápida. Ver bucles secundarios - codex.wordpress.org/Function_Reference/…
hakre
1
Gracias por el enlace. Sabía que podía configurar un ciclo adicional, pero parece excesivo. Mi solución fue agregar un filtro. Lo veo como una pequeña grasa de codo ahora por mucho menos código más adelante.
jlengstorf
0

Puede usar mi función personalizada para filtrar el contenido (es de NARGA Framework )

  • Si la publicación tiene un extracto personalizado, muéstrelo en su lugar el contenido
  • Generar automáticamente un extracto del contenido si la publicación no tiene un cerpt personalizado
  • Recorte automático de código corto, código HTML, eliminar [...], agregar texto "Leer más" (traducible)

        /**
        * Auto generate excerpt from content if the post hasn't custom excerpt
        * @from NARGA Framework - http://www.narga.net/narga-core
        * @param $excerpt_lenght  The maximium words of excerpt generating from content
        * @coder: Nguyễn Đình Quân a.k.a Narga - http://www.narga.net
        **/  
        function narga_excerpts($content = false) {
        # If is the home page, an archive, or search results
        if(is_front_page() || is_archive() || is_search()) :
            global $post;
        $content = $post->post_excerpt;
        $content = strip_shortcodes($content);
        $content = str_replace(']]>', ']]>', $content);
        $content = strip_tags($content);
        # If an excerpt is set in the Optional Excerpt box
        if($content) :
            $content = apply_filters('the_excerpt', $content);
        # If no excerpt is set
        else :
            $content = $post->post_content;
            $excerpt_length = 50;
            $words = explode(' ', $content, $excerpt_length + 1);
        if(count($words) > $excerpt_length) :
            array_pop($words);
            array_push($words, '...<p><a class="more-link" href="' . get_permalink() . '" title="' . the_title_attribute('echo=0') . '">  ' . __( 'Read more &#187;', 'narga' ) . ' </a></p>');
            $content = implode(' ', $words);
        endif;
        $content = '<p>' . $content . '</p>';
        endif;
        endif;
        # Make sure to return the content
        return $content;
        }
        // Add filter to the_content
        add_filter('the_content', 'narga_excerpts');
    
Narga
fuente