如何处理WordPress错误:不能在同一帖子上使用包装和取消包装的快捷代码

时间:2011-11-07 作者:supertrue

在分析同一页上的换行和非换行短代码时遇到问题,我在3年前遇到了这个trac问题:http://core.trac.wordpress.org/ticket/9264

问题是WP无法正确解析

[myshortcode att="bla"] and 
[myshortcode]Enclosed content[/myshortcode] 
在同一页上。上面给出了一个带有$att的短码”bla“和$内容”and [myshortcode]Enclosed content.“”

添加结束标记[/myshortcode]无助于:

[myshortcode att="bla"][/myshortcode] and
[myshortcode]Enclosed content[/myshortcode] 
Wordpress无法解析它,您最终得到了一个带有$att的短代码”bla“和$内容”[/myshortcode] and [myshortcode]Enclosed content.“”

正如票证作者所指出的(6个月前),

由于[测试/][测试]内容[[测试]和[测试][测试][测试]内容[[测试]都已损坏,因此似乎不可能在同一短代码标记的另一个实例之前输入内容为空的短代码。

trac记录单中的差异似乎不起作用*,所以我想知道是否有人处理过这个问题,或者可以建议修复wp-includes/shortcodes.php.

可能与wp includes/shortcode中更改行之前的注释有关。php:

// WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcodes()

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

根据mdawaffe在trac ticket 本问题引用:

[test id="1"/] first self closed, now [test id="2"]with content[/test]
[foo attr/]bar[foo attr/]bar[/foo]
[test/]
[test]foobar[/test]
[test id="1"][/test]
所有这些案例现在都奏效了。除了单元测试之外,此票据还可以关闭。

我假设这意味着它不会成为3.3中的问题。

SO网友:Sterling Hamilton

据我所知,您需要在多个短代码之间留一个空格。

我相信你可以不费吹灰之力做到这一点

[myshortcode attr="test1" content="test1" ...etc]
[myshortcode attr="test2" content="test2" ...etc]
[myshortcode attr="test3" content="test3" ...etc]
这也应该起作用:

[myshortcode]Enclosed content[/myshortcode] [myshortcode]Enclosed content[/myshortcode] [myshortcode]Enclosed content[/myshortcode] [myshortcode]Enclosed content[/myshortcode] [myshortcode]Enclosed content[/myshortcode]
此外:

http://codex.wordpress.org/Shortcode_API

解析器不会像您希望的那样处理同一短代码的封闭形式和非封闭形式的混合。例如,如果您有:

[myshortcode example=\'non-enclosing\' /] non-enclosed content [myshortcode] enclosed content [/myshortcode]
解析器没有将其视为由文本“非封闭内容”分隔的两个短代码,而是将其视为封闭“非封闭内容[myshortcode]封闭内容”的单个短代码。

因此,这似乎不是一个bug。这似乎是记录在案的行为。

自动关闭的短代码可以很好地协同工作。

我也可能不理解这个问题,但我尝试了以下方法:

[svg src="test" width="300" height="300" style="display:block; margin:auto;" type="embed"]1111[/svg] [svg src="test" width="300" height="300" style="display:block; margin:auto;" type="embed"]1111[/svg] [svg src="test" width="300" height="300" style="display:block; margin:auto;" type="embed"]1111[/svg] [svg src="test" width="300" height="300" style="display:block; margin:auto;" type="embed"]1111[/svg]
这非常有效。

代码最终如下所示:

function process_shortcode( $atts , $input ) { 
    $valid_attributes = array( \'src\' , \'style\' , \'type\' , \'width\' , \'height\' );

    $content = NULL;

    foreach( $atts as $attribute => $value ) { 
        if( ! in_array( $attribute , $valid_attributes ) ) { 
            $content .= "\\n" . \'<!-- Invalid attribute ignored: \' . $attribute . \' -->\' . "\\n";
        }   
    }   

    switch( $atts[ \'type\' ] ) { 
        case \'iframe\':
            $content .= \'<iframe src="\' . $atts[ \'src\' ] . \'" width="\' . $atts[ \'width\' ] . \'" height="\' . $atts[ \'height\' ] . \'" style="\' . $atts[ \'style\' ] . \'">\';
            $content .= \'</iframe>\';
        break;
        case \'embed\':
        default:
            $content .= \'<div>\';
            $content .= $input;
            $content .= \'<embed src="\' . $atts[ \'src\' ] . \'" width="\' . $atts[ \'width\' ] . \'" height="\' . $atts[ \'height\' ] . \'" \';
            $content .= \'type="image/svg+xml" pluginspage="http://www.adobe.com/svg/viewer/install/" style="\' . $atts[ \'style\' ] . \'" /> \';
            $content .= \'</div>\';
        break;
    }

    return $content;
}

结束

相关推荐

Multiple Content Shortcodes

我试图为多选项卡面板创建一个快捷代码。用户可以设置每个选项卡的选项卡数、标题和内容。可能是这样的:[tabs number=\'4\'] [tab title=\'First_tab_title\']first tab content[/first_tab] ... ... [/tabs] 现在,我想知道。虽然可以这样做,但我不喜欢这样,我必须创建单独的短代码,如制表符和制表符。是否有其他更好的方法将所有这些信息传递到单个[选项卡]快捷码?