apply_filters() și the_excerpt dau rezultate neașteptate

31 dec. 2011, 19:23:58
Vizualizări: 29.1K
Voturi: 10

Simt că îmi scapă ceva destul de evident aici, dar nu reușesc să fac WordPress-ul să coopereze.

Generez tag-uri Facebook OG cu o funcție. Totul funcționează bine, cu excepția excerpt-ului.

De când s-a depreciat get_the_excerpt($post->ID), există o altă modalitate de a crea un excerpt fără a fi nevoie să creez o buclă nouă? Mi se pare excesiv.

Prima mea idee a fost să folosesc apply_filters():

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

Asta îmi dă postarea completă, inclusiv conținutul formatat HTML. Ok, trebuie să fie greșit. Așa că am încercat următoarea idee logică:

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

Nu merge. Acum nu mai este HTML, dar tot postarea completă apare (ceea ce e foarte confuz).

Bine, nicio problemă. Să sărim peste toate lucrurile complicate și să mergem direct la intrarea trunchiată:

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

Nicio schimbare.

Deci, întrebarea mea este: ce naiba se întâmplă? Am omis ceva aici?

M-am uitat în nucleul WP să văd cum funcționează the_excerpt(), și pare să fie identic cu apelul meu:

/**
 * Afișează excerpt-ul postării.
 *
 * @since 0.71
 * @uses apply_filters() Apelează hook-ul 'the_excerpt' pentru excerpt-ul postării.
 */
function the_excerpt() {
    echo apply_filters('the_excerpt', get_the_excerpt());
}

Am câteva întrebări bazate pe descoperirile mele:

  1. De ce nu se aplică filtrul așa cum era de așteptat?
  2. Există o modalitate de a obține excerpt-ul în afara buclei fără a crea o buclă nouă?
  3. Sunt nebun?

Mulțumesc anticipat pentru ajutor. Sunt destul de nedumerit aici.

3
Comentarii

get_the_excerpt() nu este învechită, doar parametrul suplimentar care era transmis anterior nu mai este folosit.

Milo Milo
31 dec. 2011 19:47:17

Scuze, asta am vrut să spun. Mulțumesc pentru clarificare.

jlengstorf jlengstorf
31 dec. 2011 20:55:57

Ești nebun!... la fel și eu lol

pythonian29033 pythonian29033
7 oct. 2016 11:15:11
Toate răspunsurile la întrebare 3
5
16

Se pare că răspunsul se afla în wp_trim_excerpt().

Funcția este definită în wp-includes/functions.php:1879:

/**
 * Generează un fragment din conținut, dacă este necesar.
 *
 * Fragmentul va conține 55 de cuvinte, iar dacă textul este mai lung,
 * se va adăuga ' [...]' la sfârșit. Dacă textul are mai puțin de 55 de cuvinte,
 * va fi returnat nemodificat.
 *
 * Limita de 55 de cuvinte poate fi modificată de plugin-uri/teme folosind filtrul excerpt_length
 * Șirul ' [...]' poate fi modificat de plugin-uri/teme folosind filtrul excerpt_more
 *
 * @since 1.5.0
 *
 * @param string $text Opțional. Fragmentul. Dacă este gol, se generează un fragment.
 * @return string Fragmentul generat.
 */
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);
}

Deci orice text transmis ca parametru nu este procesat; funcționează doar dacă este apelată cu un parametru gol.

Pentru a rezolva această problemă, am adăugat un filtru rapid în tema mea:

/**
 * Permite generarea de fragmente în afara buclei.
 * 
 * @param string $text  Textul de tăiat
 * @return string       Textul tăiat
 */
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');

Este oarecum redundant, dar îmi place mai mult decât să deschid noi bucle de fiecare dată când vreau să generez un fragment.

1 ian. 2012 20:12:04
Comentarii

Ah, nu mi-a fost clar că cauți doar operația pe text (nu extragerea din baza de date).

hakre hakre
2 ian. 2012 10:08:46

Nu-ți face griji. Mereu mi-e teamă că nu mă fac înțeles când pun întrebări. Extrăgeam din baza de date, dar nu am vrut să deschid o altă buclă, având la dispoziție funcții precum get_the_title($post->ID). Linia finală de cod a fost $description = wp_trim_excerpt(get_post($post->ID)->post_content);

jlengstorf jlengstorf
2 ian. 2012 21:56:31

Mă simt foarte prost să întreb asta, dar cum apelezi acest filtru nou? Am încercat cu $content = apply_filters( 'rw_trim_excerpt', $content ); și $content = rw_trim_excerpt($content);, dar niciuna nu a funcționat (prima nu a tăiat conținutul, iar a doua a produs o eroare).

Eric K Eric K
26 aug. 2015 19:33:39

@QuantumDynamix Acest cod este conceput să modifice gestionarea get_the_excerpt pentru a imita the_excerpt, astfel încât să poți apela: apply_filters('get_the_excerpt', $content);.

jlengstorf jlengstorf
1 sept. 2015 20:07:54

uff! bună soluție din perspectiva unui începător în WordPress, mulțumesc

pythonian29033 pythonian29033
7 oct. 2016 11:45:08
5

Încearcă:

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

Vezi: get_post­Codex pentru toți membrii disponibili returnați.

31 dec. 2011 20:09:46
Comentarii

Returnează gol dacă nu a fost introdus niciun rezumat pentru articol. Trebuie să reproduc acțiunile funcției get_the_excerpt() (creând un rezumat dacă nu există).

jlengstorf jlengstorf
31 dec. 2011 21:00:08

Aplicarea filtrului nu va face asta, deci pui întrebarea greșită. Nu știu de ce cauți un rezumat dacă nu există niciunul. get_the_excerpt() nu face asta, verifică codul sursă, accesează doar variabila membru a $post care este post_excerpt. Vezi și link-ul din codex din răspuns.

hakre hakre
31 dec. 2011 21:11:49

Din intrarea Codex despre the_excerpt: "va afișa un rezumat automat care se referă la primele 55 de cuvinte din conținutul articolului."

Încerc să reproduc acest comportament în afara buclei.

jlengstorf jlengstorf
31 dec. 2011 22:14:44

Bine, vom crea temporar o a doua buclă și vom interoga acel fișier după ID-ul său, probabil pentru o soluție rapidă. Vezi Bucle Secundare - http://codex.wordpress.org/Function_Reference/query_posts#Secondary_Loops

hakre hakre
1 ian. 2012 00:07:42

Mulțumesc pentru link. Știam că pot configura o buclă suplimentară, dar mi s-a părut exagerat. Soluția mea a fost adăugarea unui filtru. O văd ca puțin efort acum pentru mult mai puțin cod mai târziu.

jlengstorf jlengstorf
1 ian. 2012 20:14:50
0

Poți folosi funcția mea personalizată pentru a filtra conținutul (este din NARGA Framework)

  • Dacă articolul are un rezumat personalizat, afișează-l în locul conținutului
  • Generează automat un rezumat din conținut dacă articolul nu are un rezumat personalizat
  • Elimină automat shortcode-urile, codul HTML, elimină [...], adaugă textul "Citește mai mult" (traductibil)

        /**
        * Generează automat un rezumat din conținut dacă articolul nu are un rezumat personalizat
        * @from NARGA Framework - http://www.narga.net/narga-core
        * @param $excerpt_lenght  Numărul maxim de cuvinte pentru rezumatul generat din conținut
        * @coder: Nguyễn Đình Quân a.k.a Narga - http://www.narga.net
        **/  
        function narga_excerpts($content = false) {
        # Dacă este pagina principală, o arhivă sau rezultatele căutării
        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);
        # Dacă există un rezumat setat în caseta Rezumat Opțional
        if($content) :
            $content = apply_filters('the_excerpt', $content);
        # Dacă nu există un rezumat setat
        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') . '">  ' . __( 'Citește mai mult &#187;', 'narga' ) . ' </a></p>');
            $content = implode(' ', $words);
        endif;
        $content = '<p>' . $content . '</p>';
        endif;
        endif;
        # Asigură-te că returnezi conținutul
        return $content;
        }
        // Adaugă filtru la the_content
        add_filter('the_content', 'narga_excerpts');
    
15 mai 2013 16:49:28