Usando wp_trim_excerpt para obtener the_excerpt () fuera del bucle

19

Estoy creando un tema que mostrará extractos en la página de inicio para potencialmente docenas de publicaciones. No tengo extractos manuales en todas mis publicaciones, por lo que $post->post_excerpt está vacío para muchas publicaciones. En caso de que no haya un extracto manual, me gustaría usar la función incorporada get_the_excerpt (), pero no está disponible fuera del bucle.

Al rastrear la función, parece que usa wp_trim_excerpt de wp-includes / formatting.php para crear extractos sobre la marcha. Lo estoy llamando en mi código como wp_trim_excerpt( $item->post_content ) , pero simplemente está devolviendo el contenido completo. ¿Estoy haciendo algo mal?

Sé que puedo crear mi propia función para crear un extracto, pero me gusta usar funciones integradas siempre que sea posible, manteniendo mi código compatible con otros posibles complementos / filtros.

enlace

    
pregunta Derek Perkins 14.01.2011 - 11:34

7 respuestas

21

Desde WP 3.3.0, wp_trim_words() es útil si puede obtener el contenido para el que desea generar un extracto. Espero que sea útil para alguien y que ahorre al crear su propia función de conteo de palabras.

enlace

    
respondido por el jamesc 22.03.2012 - 22:28
8

wp_trim_excerpt() tiene un poco de mecánica curiosa: si se le pasa algo, entonces no hace nada.

Aquí está la lógica básica detrás de esto:

  • get_the_excerpt() verifica el extracto manual;
  • wp_trim_excerpt() interviene si no hay un extracto manual y se crea uno a partir del contenido o teaser.

Ambos están estrechamente ligados a las variables globales y, por lo tanto, a Loop.

Fuera del Loop, es mejor que saque el código de wp_trim_excerpt() y escriba su propia función de recorte.

    
respondido por el Rarst 14.01.2011 - 13:01
6

Actualización:

Aquí hay un derivado de wp_trim_excerpt () que utilicé. Funciona perfectamente. Derivado de Wordpress versión 3.0.4

function my_excerpt($text, $excerpt)
{
    if ($excerpt) return $excerpt;

    $text = strip_shortcodes( $text );

    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]>', $text);
    $text = strip_tags($text);
    $excerpt_length = apply_filters('excerpt_length', 55);
    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
    $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
    if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);
            $text = $text . $excerpt_more;
    } else {
            $text = implode(' ', $words);
    }

    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
    
respondido por el Ardee Aram 21.01.2011 - 04:09
1

Aquí está mi opinión sobre un "extracto de recorte" que toma el objeto de publicación o una identificación de publicación como parámetro.

Obviamente basado en lo que está en el núcleo. No sé por qué este (y get_the_author ()) no tienen equivalentes que no sean de bucle.

/**
     * Generates an excerpt from the content, if needed.
     *
     * @param int|object $post_or_id can be the post ID, or the actual $post object itself
     * @param string $excerpt_more the text that is applied to the end of the excerpt if we algorithically snip it
     * @return string the snipped excerpt or the manual excerpt if it exists         
     */
    function zg_trim_excerpt($post_or_id, $excerpt_more = ' [...]') {
        if ( is_object( $post_or_id ) ) $postObj = $post_or_id;
        else $postObj = get_post($post_or_id);

        $raw_excerpt = $text = $postObj->post_excerpt;
        if ( '' == $text ) {
            $text = $postObj->post_content;

            $text = strip_shortcodes( $text );

            $text = apply_filters('the_content', $text);
            $text = str_replace(']]>', ']]>', $text);
            $text = strip_tags($text);
            $excerpt_length = apply_filters('excerpt_length', 55);

            // don't automatically assume we will be using the global "read more" link provided by the theme
            // $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
            $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
            if ( count($words) > $excerpt_length ) {
                array_pop($words);
                $text = implode(' ', $words);
                $text = $text . $excerpt_more;
            } else {
                $text = implode(' ', $words);
            }
        }
        return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
    }
    
respondido por el Tom Auger 26.08.2011 - 19:23
0

+1 a Rast. Es muy extraño que no haya tal cosa como get_the_excerpt ($ post- > ID), cuando debería ser bastante obvio que debería. De todos modos, aquí está wp_trim_excerpt () en wordpress versión 3.0.4:

enlace

function wp_trim_excerpt($text) {
1824            $raw_excerpt = $text;
1825            if ( '' == $text ) {
1826                    $text = get_the_content('');
1827    
1828                    $text = strip_shortcodes( $text );
1829    
1830                    $text = apply_filters('the_content', $text);
1831                    $text = str_replace(']]>', ']]>', $text);
1832                    $text = strip_tags($text);
1833                    $excerpt_length = apply_filters('excerpt_length', 55);
1834                    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
1835                    $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
1836                    if ( count($words) > $excerpt_length ) {
1837                            array_pop($words);
1838                            $text = implode(' ', $words);
1839                            $text = $text . $excerpt_more;
1840                    } else {
1841                            $text = implode(' ', $words);
1842                    }
1843            }
1844            return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
1845    }

Puede ver en la línea 1826 que está vinculado a la variable global $ post a través de get_the_contents. Y sí, no tengo ni idea de lo que estaban pensando. Pero a partir de aquí, reemplaza get_the_content con $ text en tu propio my_excerpt, y debería comportarse de manera similar.

    
respondido por el Ardee Aram 21.01.2011 - 04:01
0

La función get_the_content () devolvería el contenido completo si $ más! = 0. Debe establecer la variable global $ más en 0 para asegurarse de que la función get_the_content () devuelva el extracto.

Función wp_trim_excerpt () modificada:

function wp_trim_excerpt($text) {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        global $more;
        $tmp = $more;
        $more = 0;
        $text = get_the_content('');
        $more = $tmp;

        $text = strip_shortcodes( $text );

        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $text = strip_tags($text);
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
        if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);
            $text = $text . $excerpt_more;
        } else {
            $text = implode(' ', $words);
        }
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
    
respondido por el user4742 17.04.2011 - 19:36
0

Usando las respuestas de los demás arriba, aquí hay una respuesta más simple que parece funcionar bien:

global $post;

$excerpt = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post->ID));

if ( $excerpt == '' ) {
    $excerpt = wp_trim_words( $post->post_content, 55 );
}

Lo estoy usando en las etiquetas <meta> en una función para definir las descripciones de OpenGraph. Entonces simplemente agrego:

<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />
    
respondido por el dpruth 15.09.2016 - 18:42

Lea otras preguntas en las etiquetas