将快捷码包含在另一个快捷码中

时间:2014-05-07 作者:rafiki_rafi

我想将帖子内容中现有的短代码封装在我要添加到插件中的新短代码中。现有内容如下所示:

 Some text - could be <span>HTML</span> or other shortcodes
 ....
 [component id=12]
 [component id=13]
 [component id=14]
 ....
 Some text - could be <span>HTML</span> or another shortcodes
我正在尝试编写一个脚本,它将逐条发布,提取出表单中的任何短代码[component id=X] 并将其包装在另一个短代码中,如下所示:

 Some text - could be <span>HTML</span> or other shortcodes
 ....
 [components]
     [component id=12]
     [component id=13]
     [component id=14]
 [/components]
 ....
 Some text - could be <span>HTML</span> or another shortcodes
我很难为这个写正则表达式。我希望使用preg_replace_callback() 但不确定这是否是适当的功能。

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

这是我想出的剧本。它循环遍历WordPress实例中的所有帖子,并将其分为三个部分:

短代码行之前的HTML/内容短代码行之后的HTML/内容我决定使用substr() 拆分内容。然后,我将所有内容重新组装到一起,并在中间部分添加“包装”快捷代码。

$args = array( \'numberposts\' => -1, \'post_status\' => \'publish|draft|trash\' )
$posts = get_posts( $args );
if( !empty( $posts ) ){
    foreach( $posts as $post ){
        $content = $post->post_content;
        if( !has_shortcode( $content, \'components\') ){
            $pattern = \'/\\[component id=\\"[0-9]+\\"\\]/\';
            preg_match_all( $pattern, $content, $matches, PREG_OFFSET_CAPTURE);

            $first_match = $matches[0][0];
            $first_match_start = $first_match[1]; // Start position of the first match

            $last_match = $matches[0][ count($matches[0]) - 1 ];
            $last_match_start = $last_match[1];
            $last_match_end = $last_match_start + strlen($last_match[0]);

            $before_html = substr($content, 0, $first_match_start); // Get all the content before the first match of [component id="XYZ"]
            $component_shortcodes = substr($content, $first_match_start, $last_match_end - $first_match_start ); // Get everything in between the first [component id="XYZ"] and the last
            $after_html = substr($content, $last_match_end ); // Get everything after the last [component id="XYZ"] match
            // Perform the actual wrapping here
            $new_content = $before_html . \'[components]\' . $component_shortcodes . \'[/components]\' . $after_html;
            $post->post_content = $new_content;
            wp_update_post( $post );
        }
    }
}

结束

相关推荐

Manipulated shortcode output

我开发的一个注册短代码的插件有问题。短代码返回一个包含有效HTML的字符串,但一些主题似乎操纵了短代码返回的HTML,我真的不明白原因是什么。例如,这是我的短代码的正确输出:<div class=\"tile\"> <a> <img src=\"0.jpg\" /> <div class=\"caption\"> <p>Kate</p> </div&