Spezifische Shortcode-Ausgabe filtern?

7

Gibt es einen Hook in WordPress, mit dem ich die Ausgabe eines bestimmten Shortcodes filtern kann? Etwas wie das:

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

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

Wo $shortcodewäre so etwas [my_schortcode]oder noch besser, Shortcode und seine Attribute in einem Array getrennt.

Ragulka
quelle

Antworten:

6

Es gibt keinen mir bekannten Filter , der auf einzelne Shortcodes abzielt, wie Sie es möchten.

Sie können jedoch Attribute mit filtern shortcode_atts_{$shortcode}.

Sie können einen anderen Shortcode entführen, indem Sie Ihren eigenen Rückruf erstellen und ihn beim ursprünglichen Shortcode-Slug registrieren. Ich denke, das ist es, was Sie wahrscheinlich tun müssen.

Konzeptioneller Beweiß:

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

Versuchen Sie nun, eine Galerie zu verwenden :)

s_ha_dum
quelle
Du hast recht. Es gibt keinen Filter für das, was ich wollte. Also filtere ich stattdessen the_content. Es funktioniert für meinen Anwendungsfall.
Ragulka
2
Ab Version 4.7 gibt es einen Filter. Siehe Shawn Hs Antwort unten .
Dave Romsey
13

WordPress 4.7 hat einen neuen Filter eingeführt, do_shortcode_tagum genau dies zu tun.

Shawn H.
quelle
2
+1 für diese Lösung, da sie jetzt die akzeptierte Antwort ersetzt. Es wäre schön, wenn Sie Ihre Antwort bearbeiten und ein kleines Beispiel für die Verwendung geben könnten. Die Filterparameter sind nicht offensichtlich .
Aurovrata
1
Der Vollständigkeit halber: developer.wordpress.org/reference/hooks/do_shortcode_tag
maryisdead
Endlich Jahre auf diese Art der Umsetzung gewartet. Wp sollte diese Art von Filtern vor dem Rendern immer anwenden. Ein Beispiel zum Entfernen von 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);
Einrückungen mit
1

Während es keinen Haken gibt, gibt es eine kleine Problemumgehung, die Ihr Endziel ermöglicht. Sie können einen neuen Shortcode erstellen, den Sie pro Instanz immer um jeden anderen Shortcode wickeln, dessen Ausgabe Sie filtern möchten.

Verwendung in einem Beitrag usw.:

Here is some post text. Blah blah...
[filter][target_annoying_shortcode size="small" limit="20"][/filter] 
Here is some more text in my post. More blah blah...

In functions.php:

function my_shortcode_output_filter( $attr, $content ) {

    // Express the shortcode into its output
    $content_translated = do_shortcode(trim($content));
    if($shortcode_to_modify == $content || !$content_translated) {
        // Error handling
        return 'There was an error in filtering shortcode: '.$content;  
    }

    // Now modify the output as you like, here...

    $content_translated_and_filtered = $content_translated;

    return $content_translated_and_filtered;
 }
 add_shortcode('filter', 'my_shortcode_output_filter');
Adam Friedman
quelle
0

Das einzige, was Sie filtern können, sind die Attribute für den Shortcode:

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

Punkt ist, das $shortcodeist das dritte Argument bei der Registrierung eines Shortcodes. Dieses Argument ist ziemlich neu und wird von fast keinem Shortcode verwendet. Daher wird auf die Standardeinstellung zurückgegriffen - eine stringvon ''.

Dies führt zu einem lustigen Ergebnis:

add_filter( 'shortcode_atts_', 'wpse112294_shortcode_atts_cb' );
function wpse112294_shortcode_atts_cb( $out, $pairs, $atts )
{
    // here we need to find a way to uniquely identify a shortcode
    // for which we ain't got a name

    // something that makes the shortcode unique:
    $found = isset( $pairs['foo_attribute_key'] );
    if ( $found )
    {
        // Instantly remove this filter to save processing time:
        remove_filter( current_filter(), __FUNCTION__ );

        // do something stunning in here!
    }

    return $out;
}

Also, ja , mit einer 90% igen Chance müssen wir die Leistung von jedem (!) Shortcode filtern und versuchen, irgendwie den Shortcode zu identifizieren , indem sie entweder einig Standardargumente ( $pairs) oder durch Eingabeargumente (unmöglich). Dann können wir endlich die Ausgabe verarbeiten. Können wir den String selbst verarbeiten? Nein. Dies muss so erfolgen, wie @s_ha_dum oben gezeigt hat.

Kaiser
quelle
0

Während @s_ha_dum eine anständige Antwort gab, Sie können eine neue Shortcode zum Zweck der Filterung eines bestehenden Shortcode erstellen. Zum Beispiel,

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

    //save shortcode output in $return
    $return = do_shortcode("[existing_shortcode att1='$att1' att2='$att2'".$content."/existing_shortcode]");

    //insert code to modify $return

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

Beachten Sie, dass Sie für den [embed]Shortcode verwenden müssen

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

anstatt do_shortcode

yitwail
quelle