是否筛选特定的短码输出?

时间:2013-08-30 作者:ragulka

WordPress中是否有一个钩子可以用来过滤特定短代码的输出?类似这样:

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

function my_filter_function ( $output, $shortcode ) {
    ....
}
在哪里$shortcode 大概是[my_schortcode] 或者更好的是,将shortcode及其属性分离成一个数组。

5 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

There is no filter 据我所知,这意味着要针对您想要的单个短代码。

可以使用筛选属性shortcode_atts_{$shortcode} 虽然

您可以通过创建自己的回调并将其注册到原始短代码slug来劫持另一个短代码。我想这就是你可能需要做的。

概念验证:

function my_gallery_shortcode($atts) {
  return \'howdy\';
}
add_shortcode(\'gallery\',\'my_gallery_shortcode\');
现在尝试使用库:)

SO网友:Shawn H

WordPress 4.7引入了一个新的过滤器,do_shortcode_tag, 要做到这一点。

SO网友:Adam Friedman

虽然没有挂钩,但有一个小的变通方法可以使您的最终目标成为可能。您可以创建一个新的短代码,在每个实例的基础上,始终围绕要过滤其输出的任何其他短代码。

在帖子等中的用法:

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...
在函数中。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\');

SO网友:kaiser

您唯一可以过滤的是短代码的属性:

apply_filters( "shortcode_atts_{$shortcode}", $out, $pairs, $atts );
重点是$shortcode 是注册短代码时的第三个自变量。这个参数是非常新的,几乎没有短代码使用它,因此它将返回到默认值,即string 属于\'\'.

这导致了一个有趣的结果:

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;
}
所以,yes, 我们有90%的机会过滤每个(!)的输出shortcode并尝试通过一些默认参数以某种方式识别该shortcode($pairs) 或通过输入参数(不可能)。然后,我们终于可以处理输出了。我们能够处理字符串本身吗?不可以。这必须按照上面显示的@s\\u ha\\u dum的方式进行。

SO网友:yitwail

虽然@s\\u ha\\u dum给出了一个不错的答案,但您可以创建一个新的短代码来过滤现有的短代码。例如

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\');
请注意,对于[embed] 短代码,您必须使用

global $wp_embed;
$return = $wp_embed->run_shortcode("[embed ...
而不是do_shortcode

结束

相关推荐

Filters on Login Page

我正在尝试使用修改登录页built in filters. add\\u操作按预期工作,但我无法使筛选器工作。这是我函数中的代码。php:add_filter( \'login_form_top\', \'filter_top_login\' ); function filter_top_login( $content ) { return \'This is what I want it to say!\'; } 但当我加载wp登录时,它似乎没有做任何