Filtrarea outputului unui shortcode specific?
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.
WordPress 4.7 a introdus un nou filtru, do_shortcode_tag
, pentru a face exact acest lucru.

+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.

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

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

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

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 :)

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.

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

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

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.

Î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
