Folosirea wp_trim_excerpt pentru a obține the_excerpt() în afara buclei

14 ian. 2011, 12:34:06
Vizualizări: 37.2K
Voturi: 21

Construiesc o temă care va afișa extrase pe pagina principală pentru potențial zeci de postări. Nu am extrase manuale pentru toate postările mele, așa că $post->post_excerpt este gol pentru multe postări. În cazul în care nu există un extras manual, aș dori să folosesc funcția încorporată get_the_excerpt(), dar aceasta nu este disponibilă în afara buclei.

Urmărind funcția, se pare că folosește wp_trim_excerpt din wp-includes/formatting.php pentru a crea extrase în timp real. O apelez în codul meu astfel wp_trim_excerpt( $item->post_content ), dar aceasta returnează doar conținutul complet. Fac ceva greșit?

Știu că pot crea propria mea funcție pentru a genera un extras, dar prefer să folosesc funcții încorporate acolo unde este posibil, păstrând codul meu compatibil cu alte potențiale plugin-uri / filtre.

http://adambrown.info/p/wp_hooks/hook/wp_trim_excerpt?version=3.0&file=wp-includes/formatting.php

1
Comentarii

Ai putea încerca să apelezi filtrele pentru excerpt... $myvar = apply_filters( 'the_excerpt', $myvar );

t31os t31os
15 ian. 2011 18:14:17
Toate răspunsurile la întrebare 7
0
22

Începând cu WP 3.3.0, funcția wp_trim_words() este utilă dacă doriți să obțineți conținutul pentru care trebuie să generați un rezumat. Sper că acest lucru este util cuiva și că vă salvează de la crearea unei funcții proprii pentru numărarea cuvintelor.

http://codex.wordpress.org/Function_Reference/wp_trim_words

22 mar. 2012 23:28:30
0

wp_trim_excerpt() are o mică particularitate - dacă i se transmite orice, nu face nimic.

Iată logica de bază din spatele acesteia:

  • get_the_excerpt() verifică dacă există un fragment manual;
  • wp_trim_excerpt() intervine dacă nu există un fragment manual și creează unul din conținutul articolului sau din textul de prezentare.

Ambele funcții sunt strâns legate de variabilele globale și, prin urmare, de Loop.

În afara Loop-ului, este mai bine să extragi codul din wp_trim_excerpt() și să îți scrii propria funcție de tăiere.

14 ian. 2011 14:01:10
2

Actualizare:

Iată o variantă derivată din wp_trim_excerpt() pe care am folosit-o. Funcționează perfect. Derivă din versiunea Wordpress 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);
}
21 ian. 2011 05:09:36
Comentarii

Nu este nevoie să postezi un nou răspuns, poți oricând să editezi cel vechi pentru a include informații noi. De exemplu, ai putea copia linkul către codul WP din primul tău răspuns în acesta și apoi să ștergi primul răspuns.

Jan Fabry Jan Fabry
25 ian. 2011 11:01:26

Pentru cei care copiați/lipești: adăugați $raw_excerpt = $text;

Svetoslav Marinov Svetoslav Marinov
12 apr. 2015 02:30:27
0

Iată versiunea mea a unei funcții "trim_excerpt" care acceptă ca parametru fie obiectul post, fie un ID de post.

Evident, inspirată din ceea ce există în nucleul WordPress. Nu știu de ce această funcție (și get_the_author()) nu au echivalente care să funcționeze în afara buclei.

/**
     * Generează un fragment din conținut, dacă este necesar.
     *
     * @param int|object $post_or_id poate fi ID-ul postului sau obiectul $post în sine
     * @param string $excerpt_more textul care este adăugat la sfârșitul fragmentului dacă acesta este generat algoritmic
     * @return string fragmentul generat sau fragmentul manual dacă acesta există         
     */
    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);

            // nu presupune automat că vom folosi link-ul global "read more" oferit de temă
            // $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);
    }
26 aug. 2011 20:23:10
1

+1 pentru Rast. Este foarte ciudat că nu există o funcție precum get_the_excerpt($post->ID), când ar fi destul de evident că ar trebui să existe. Oricum, iată funcția wp_trim_excerpt() din WordPress versiunea 3.0.4:

http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/formatting.php

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    }

Puteți vedea pe linia 1826 că este legată de variabila globală $post prin intermediul funcției get_the_contents. Și da, nu am nicio idee la ce se gândeau. Dar de aici, înlocuiți get_the_content cu $text în propria funcție my_excerpt, și ar trebui să se comporte într-un mod similar.

21 ian. 2011 05:01:45
Comentarii

azure_ardee: ia în considerare utilizarea wp_trim_words()

User User
3 dec. 2012 20:35:45
0

Funcția get_the_content() va returna întregul conținut dacă $more != 0. Trebuie să setezi variabila globală $more la 0 pentru a te asigura că funcția get_the_content() returnează rezumatul.

Funcția modificată wp_trim_excerpt():

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);
}
17 apr. 2011 20:36:45
1

Folosind răspunsurile anterioare, iată o soluție mai simplă care funcționează eficient:

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

O folosesc în tag-urile <meta> dintr-o funcție pentru a defini descrierile OpenGraph. Apoi, pur și simplu adaug:

<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />
15 sept. 2016 19:42:46
Comentarii

Și cum rămâne cu conținutul HTML? Cum se vor gestiona etichetele? fragmentul de text elimină și etichetele HTML și shortcode-urile. Ce se întâmplă dacă primele cuvinte din fragment conțin o imagine? Probabil că va strica layout-ul tău.

brett brett
4 dec. 2019 18:49:38