Ckeditor / PHP中的wordpress样式短代码

时间:2015-02-12 20:34:55

标签: php mysql function ckeditor

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

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

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

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,从挖掘并找到这个线程 How to create a Wordpress shortcode-style function in PHP

我可以在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]]

它始终将文本放在视频下而不是文档中的位置。我需要想办法让短代码按照它的顺序执行。