在Ckeditor/PHP中使用wordpress风格的短代码


wordpress style shortcodes in Ckeditor / PHP

我已经构建了一个自定义CMS。最近,我添加了动态创建页面的功能。我使用了CKEditor作为这些页面的内容。我还想运行一些php函数,这些函数可能包含在存储在mysql中的页面内容中。我不想在数据库中存储实际的PHP代码,而是可能存储函数名。例如,在我可能拥有的数据库中存储的页面中。

<?php //begin output
hello world!
check out this latest news article.
news($type, $id);
//end output 
?>

如果在输出中找到EVAL,那么在不使用EVAL的情况下查找和执行此现有函数的最佳方法是什么?我是按照wordpress风格的短代码来思考的。也许是[[news(最新,71]]?如果这些函数存在于我的functions.php文件中,那么就有一个函数来查找和执行它们。不确定最好的方法。我不搜索任何代码答案,但更多的是针对这类场景的最佳实践,尤其是对可能的注入最安全的方案。

我从四处挖掘和找到这个线程中找到了一个解决方案如何在PHP 中创建Wordpress短代码风格的函数

我可以在CKEditor 中传递这样的短代码

[[utube 1 video_id]]

然后,在我呈现代码的页面中:

print shortcodify($page_content);

使用此功能:

function shortcodify($string){
    return preg_replace_callback('#'['[(.*?)']']#', function ($matches) {
    $whitespace_explode = explode(" ", $matches[1]);
    $fnName = array_shift($whitespace_explode);
    return function_exists($fnName) ? call_user_func_array($fnName,$whitespace_explode) : $matches[0];
    }, $string);
    }

如果函数名称存在(utube),它将启动该函数。我现在唯一的问题不是把[[shortcode]]放在编辑器的哪个位置,它总是先执行。例如,在CKEditor中,我输入:

Hello world! Check out my latest video
[[utube 1 video_id]]

它总是将文本放在视频下面,而不是放在文档中的位置。我需要找到一种方法,让短代码按照放置的顺序执行。