it-swarm.com.de

Spezifische Shortcode-Ausgabe filtern?

Gibt es einen Haken 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 $shortcode so etwas wie [my_schortcode] oder noch besser wäre, werden Shortcode und seine Attribute in einem Array getrennt.

7
ragulka

Es gibt keinen Filter von dem ich weiß, dass er einzelne Shortcodes ansprechen soll, wie Sie wollen.

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

Sie können einen anderen Shortcode entführen, indem Sie einen eigenen Rückruf erstellen und ihn mit dem ursprünglichen Shortcode-Slug registrieren. Ich denke, das werden 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 benutzen :)

5
s_ha_dum

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

10
Shawn H

Obwohl es keinen Haken gibt, gibt es eine kleine Problemumgehung, die Ihr Endziel ermöglicht. Sie können einen neuen Shortcode erstellen, den Sie instanzweise 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');
1
Adam Friedman

Das einzige, was Sie filtern können, sind die Attribute des Shortcodes:

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

Der Punkt ist, dass $shortcode das dritte Argument ist, wenn ein Shortcode registriert wird. Dieses Argument ist ziemlich neu und wird von fast keinem Shortcode verwendet. Daher wird auf die Standardeinstellung zurückgegriffen. Dabei handelt es sich um eine string von ''.

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, yes , mit einer Wahrscheinlichkeit von 90% müssen wir die Ausgabe jedes (!) Shortcodes filtern und versuchen, den Shortcode durch einige Standardargumente ($pairs) oder durch Eingabeargumente zu identifizieren (unmöglich). Dann finally können wir die Ausgabe verarbeiten. Können wir den String selbst verarbeiten? Nein. Dies muss so geschehen, wie es @s_ha_dum oben gezeigt hat.

0
kaiser

Während @s_ha_dum eine anständige Antwort gab, kann erstellen Sie einen neuen Shortcode, um einen vorhandenen Shortcode zu filtern. 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 ...

anstelle von do_shortcode

0
yitwail