我將編寫一些示例代碼,所以它是我遇到的問題的簡短示例。Wordpress外部短代碼解析內部短代碼內容的html標記
比方說,我已經存儲在數據庫中的以下文字:
[form]
<ul>
[each name="upgrades"]
<li><input type="checkbox" [value name="upgrade_name" id="1"] />[value name="upgrade_name" id="2"]</li>
[/each]
</ul>
[/form]
如果我對這個文本運行do_shortcode
,INSIDE html標籤裏面的each
內容的簡碼解析,而不是被推遲到each
簡碼。但是,each
內容中不在html標籤中的簡碼不會被解析,直到each
簡碼在其內容上運行do_shortcode
,這應該是正確的行爲。
。換句話說,在value
簡碼ID爲1
太快(在form
簡碼通)分析,但在value
簡碼與ID 2
不解析直到each
短代碼運行在它do_shortcode
,所以它產生正確的值。
我知道我可以將表單簡碼上的ignore_html標誌設置爲true
,但這是不正確的,因爲用戶可能希望爲短標碼解析html標籤。
有沒有解決此問題的方法?
WordPress版本4.6.1
編輯:添加重複性代碼
創建該代碼的新插件:
<?php
/*
Plugin Name: Broken Shortcodes
Description: Shortcodes should not jump the gun in parsing html tag shortcodes of inner shortcode content.
*/
remove_filter('the_content', 'wpautop');
add_shortcode('form', function($atts, $content){
echo "<textarea>This is the form's content:\n".$content.'</textarea>';
return "<textarea>This is the rendered form shortcode:\n".do_shortcode($content).'</textarea>';
});
$bad_global_variable = 'first';
add_shortcode('value', function($atts, $content){
global $bad_global_variable;
return $bad_global_variable;
});
add_shortcode('each', function($atts, $content){
global $bad_global_variable;
$_content = '';
foreach(array('second', 'third', 'fourth') as $v){
$bad_global_variable = $v;
$_content .= do_shortcode($content);
}
return $_content;
});
?>
這個文本創建一個頁面:
[form]
[each]
<div [value]>[value]</div>
[/each]
[/form]
輸出是不正確的:
<div first>second</div>
<div first>third</div>
<div first>second</div>
<div first>fourth</div>
<div first>second</div>
<div first>third</div>
<div first>second</div>