2016-11-02 124 views
1

我將編寫一些示例代碼,所以它是我遇到的問題的簡短示例。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> 
 

回答

1

一個快速的解決方法是分析自己的簡HTML標籤的。

所以,你的文字看起來像:

[form] 
 
    [each] 
 
    <!-- Notice curly brackets --> 
 
    <div {value}>[value]</div> 
 
    [/each] 
 
[/form]

然後你的每一個短代碼可能是這樣的:

add_shortcode('each', function($atts, $content){ 
 
    global $bad_global_variable; 
 
    $content = preg_replace('/\{([^}]+)\}/', '[$1]', $content, -1); 
 
    $_content = ''; 
 
    add_filter('wp_kses_allowed_html', 'parse_tags', 10, 2); 
 
    foreach(array('second', 'third', 'fourth') as $v){ 
 
    $bad_global_variable = $v; 
 
    $_content .= do_shortcode($content); 
 
    } 
 
    remove_filter('wp_kses_allowed_html', 'parse_tags', 10, 2); 
 
    return $_content; 
 
}); 
 

 
// This might be necessary depending on your use-case 
 
function parse_tags($tags, $context){ 
 
    $tags['input']['value'] = true; 
 
    return $tags; 
 
}

但是,這不應該是一個看似如此簡單的解決方案。我認爲Shortcode API需要一些TLC。

在這裏看到票:https://core.trac.wordpress.org/ticket/33134