如何在PHP中创建Wordpress短代码样式函数

时间:2010-12-31 06:10:57

标签: php wordpress shortcode

我正在尝试在PHP中创建Wordpress短代码样式功能,以用图像替换“[[133]]”等短代码。基本上,我有一个图像URL /标题/副标题的MySQL表,ID为1-150,我希望能够使用这样的短代码将它们动态插入到我的页面文本中:

Blabla bla bla bla bla。 [[5]]另外,bla bla bla bla bla [[27]] 嘿,bla bla bla! [[129]]

所以,我只想把ID作为$ id获取,然后将其提供给MySQL查询 mysql_query(“SELECT title,subtitle,url FROM images WHERE id = $ id”) 然后用img / title / subtitle替换“[[id]]”。我希望能够在同一页面上多次这样做。

我知道这必须涉及正则表达式以及preg_match,preg_replace,strstr,strpos,substr ......的一些组合......但我不知道从哪里开始以及我应该使用哪些函数来执行哪些操作。你能推荐一个策略吗?我不需要代码本身 - 只知道使用哪些部分将非常有用。

5 个答案:

答案 0 :(得分:7)

如果您希望能够编写如下的短代码:

[[function_name_suffix parameter1 parameter2 ...]]

这是一种更完整的方法,使用preg_replace_callbackcall_user_func_array来实现参数化的短代码。

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

如果定义了此功能:

function shortcode_name($firstname="",$lastname=""){
    return "<span class='firstname'>".$firstname."</span>&nbsp;<span class='lastname'>".$lastname."</span>";
}

然后这个电话

print shortcodify("My name is [[name armel larcier]]");

将输出:

My name is <span class='firstname'>armel</span>&nbsp;<span class='lastname'>larcier</span>

这只是我现在根据supertrue的想法实现的。

任何反馈都非常受欢迎。

答案 1 :(得分:4)

使用函数getimage($id)执行MySQL查询并格式化替换文本,此几乎可以执行您需要的所有操作:

$text = "Blabla [[5]] and [[111]] bla bla bla [[27]] and bla bla bla! [[129]]";

$zpreg = preg_match_all('#\[\[(\d{1,3})\]\]#', $text, $matches );

var_dump( $matches[1] );  

$newtext = preg_replace('#\[\[(\d{1,3})\]\]#', getimage($matches[1][?????]), $text);

echo $newtext;

我只需要弄清楚要放在getimage()里面的内容(其中?????是),这会使其放在正确的[[id]]图片中。

有关详细信息,请参阅官方文档中的preg_match_allpreg_replace

答案 2 :(得分:1)

可以采取各种不同的方法,具体取决于您计划如何显示等,

取“Hello [34] world”这句话

创建一个简单的函数,例如replaceCode($ string)

function replaceCode($string){

    $pos = strpos($string, '['); // Find the first occurrence of the bracket

    if($pos != false){

          // If everything is ok take the next 2 numbers from it

          // Check for a close bracket & remove ]

          // call another function to replace the number with the image text

    }




}

如果找到更多括号,则再次递归调用该函数,再将其余字符串传递给该函数。

注意:可能需要首先进行验证,以确保[和]正确平衡!

答案 3 :(得分:0)

我相信正则表达式会是:

/\[\[[1-9]{1,3}\]\]/g

(对于双括号内的1到3位数字。)

答案 4 :(得分:0)

我的赌注是PHP's strtr功能......

<?php
function get_profile_image($image_url){
    return "<img src='{$image_url}' height='200px' width='200px' />";
}

$trans = array(
    "[[1]]" => "Vishal",
    "[[2]]" => "Kumar",
    "[[3]]" => "Sahu",
    "[[4]]" => "Web Designer",
    "[[5]]" => "Draw and Paint",
    "[[6]]" => ucwords("any programming language"),
    "[[7]]" => strtoupper("PHP, JAVASCRIPT and HTML"),
    "[[8]]" => get_profile_image("http://php.net/images/logos/php-logo.svg"),
    "[[9]]" => "http://php.net/images/logos/php-logo.svg"
    );
$str = <<<HEREDOC_1
[[8]]
<pre>My name is [[1]] [[2]] [[3]].
I am a [[4]] and I love to [[5]].
I don't know [[6]] but I know [[7]] little bit.</pre>
Here is my profile image <img src='[[9]]' alt='[[1]]-[[2]]-[[3]]-[[4]]' />
HEREDOC_1;
echo strtr($str, $trans);

它的输出是

  

[http://php.net/images/logos/php-logo.svg]我叫Vishal Kumar   萨胡。我是一名网页设计师,我喜欢画画。我不知道   任何编程语言,但我知道PHP,JAVASCRIPT和HTML很少   位。这是我的个人资料图片[Vishal-Kumar-Sahu-Web Designer]

它在5.6上工作正常。