Filtrarea outputului unui shortcode specific?

30 aug. 2013, 20:10:04
Vizualizări: 22.6K
Voturi: 10

Există vreun hook în WordPress pe care îl pot folosi pentru a filtra outputul unui shortcode specific? Ceva de genul:

add_filter('shortcode_output', 'my_filter_function', 2);

function my_filter_function ( $output, $shortcode ) {
    // ...
}

Unde $shortcode ar fi ceva de genul [my_schortcode] sau și mai bine, shortcode-ul și atributele sale separate într-un array.

0
Toate răspunsurile la întrebare 5
4
29

WordPress 4.7 a introdus un nou filtru, do_shortcode_tag, pentru a face exact acest lucru.

12 ian. 2017 03:01:19
Comentarii

+1 pentru această soluție, deoarece acum înlocuiește răspunsul acceptat. Ar fi frumos dacă ai putea edita răspunsul tău și oferi un mic exemplu de utilizare. Parametrii filtrului nu sunt evidenti.

Aurovrata Aurovrata
13 ian. 2017 15:23:14

Pentru completitudine: https://developer.wordpress.org/reference/hooks/do_shortcode_tag/

maryisdead maryisdead
3 feb. 2017 12:44:57

Mai multă completitudine! https://developer.wordpress.org/reference/hooks/pre_do_shortcode_tag/

maryisdead maryisdead
3 feb. 2017 12:48:16

În sfârșit, am așteptat ani de zile pentru acest tip de implementare. Wp ar trebui să aplice întotdeauna acest tip de filtre înainte de randare. Un exemplu pentru a elimina indentările cu taburi din codul sursă: function example_shortcode_output($output, $tag, $attr, $m){ if($tag == 'gallery') $output = str_replace("\t", '', $output); return $output; } add_filter('do_shortcode_tag', 'example_shortcode_output', 10, 4);

Jonas Lundman Jonas Lundman
12 iun. 2018 14:55:22
2

Nu există niciun filtru pe care să-l cunosc care să vizeze anumite shortcode-uri individuale așa cum doriți.

Totuși, puteți filtra atributele cu shortcode_atts_{$shortcode}.

Puteți prelua controlul asupra unui alt shortcode prin crearea propriului callback și înregistrarea acestuia cu slug-ul shortcode-ului original. Cred că acesta este lucrul de care veți avea nevoie.

Dovadă de concept:

function my_gallery_shortcode($atts) {
  return 'salut';
}
add_shortcode('gallery','my_gallery_shortcode');

Acum încercați să utilizați un gallery :)

30 aug. 2013 20:35:33
Comentarii

Ai dreptate. Nu există un filtru pentru ceea ce doream. Așa că, în loc de asta, filtrez the_content. Funcționează pentru cazul meu de utilizare.

ragulka ragulka
31 aug. 2013 14:01:28

Începând cu versiunea 4.7, există un filtru. Vezi răspunsul lui Shawn H mai jos.

Dave Romsey Dave Romsey
12 ian. 2017 03:41:42
0

Deși nu există un hook, există o soluție temporară care îți permite să atingi scopul dorit. Poți crea un shortcode nou pe care, pentru fiecare instanță, să-l înfășori în jurul oricărui alt shortcode al cărui rezultat vrei să-l filtrezi.

Utilizare într-un articol, etc.:

Aici este textul articolului. Bla bla...
[filter][target_annoying_shortcode size="small" limit="20"][/filter] 
Aici este mai mult text în articolul meu. Mai mult bla bla...

În functions.php:

function my_shortcode_output_filter( $attr, $content ) {

    // Transformă shortcode-ul în output-ul său
    $content_translated = do_shortcode(trim($content));
    if($shortcode_to_modify == $content || !$content_translated) {
        // Gestionarea erorilor
        return 'A apărut o eroare la filtrarea shortcode-ului: '.$content;  
    }

    // Acum modifică output-ul după cum dorești, aici...

    $content_translated_and_filtered = $content_translated;

    return $content_translated_and_filtered;
 }
 add_shortcode('filter', 'my_shortcode_output_filter');
27 iul. 2014 23:43:52
0

Singurul lucru pe care îl poți filtra sunt atributele shortcode-ului:

apply_filters( "shortcode_atts_{$shortcode}", $out, $pairs, $atts );

Ideea este că $shortcode reprezintă al treilea argument la înregistrarea unui shortcode. Acest argument este destul de nou și aproape niciun shortcode nu îl folosește, așa că va reveni la valoarea implicită - care este un string gol ''.

Aceasta duce la un rezultat interesant:

add_filter( 'shortcode_atts_', 'wpse112294_shortcode_atts_cb' );
function wpse112294_shortcode_atts_cb( $out, $pairs, $atts )
{
    // aici trebuie să găsim o modalitate de a identifica în mod unic un shortcode
    // pentru care nu avem un nume

    // ceva care face shortcode-ul unic:
    $found = isset( $pairs['foo_attribute_key'] );
    if ( $found )
    {
        // Elimină imediat acest filtru pentru a economisi timp de procesare:
        remove_filter( current_filter(), __FUNCTION__ );

        // fă ceva uimitor aici!
    }

    return $out;
}

Deci, da, cu o șansă de 90% trebuie să filtrăm ieșirea fiecărui(!) shortcode și să încercăm să-l identificăm cumva fie prin niște argumente implicite ($pairs), fie prin argumente de intrare (imposibil). Apoi, în sfârșit, putem procesa ieșirea. Putem procesa șirul în sine? Nu. Acest lucru trebuie făcut în modul arătat de @s_ha_dum mai sus.

3 sept. 2013 19:32:43
0

În timp ce @s_ha_dum a oferit un răspuns decent, tu poți crea un nou shortcode pentru scopul de a filtra un shortcode existent. De exemplu,

function filter_function($atts, $content) {
    extract(shortcode_atts(array(
            'att1' => 'val1',
            'att2' => 'val2'
    ), $atts));

    //salvează output-ul shortcode-ului în $return
    $return = do_shortcode("[existing_shortcode att1='$att1' att2='$att2'".$content."/existing_shortcode]");

    //inserează cod pentru a modifica $return

    echo $return;
}
add_shortcode('new_shortcode','filter_function');

reține că pentru shortcode-ul [embed], trebuie să folosești

global $wp_embed;
$return = $wp_embed->run_shortcode("[embed ...

în loc de do_shortcode

6 nov. 2013 23:04:02