我在基于数据库条目自动生成短代码时遇到了一些问题。
我能够得到正常的短代码,即:
function route_sc5() {
return "<div>Route 5</div>";
}
add_shortcode('route 5','route_sc');
以及以下用于激活它的短代码为[route 5]
这很有效。但我需要的是为每个数据库条目生成的短代码。类似的东西:
$routes = $wpdb->get_results( $wpdb->prepare("SELECT * FROM wp_routes") );
foreach($routes as $route)
{
function route_sc$route->id () {
return "<div>Route $route->id</div>";
}
add_shortcode('route $route->id','route_sc$route->id');
}
以上只是我希望它如何工作的一个例子。不是字面上我正在使用的代码。我将如何实现这一目标? ): 感谢。
答案 0 :(得分:3)
以下是使用PHP 5.3 anonymous functions:
的动态短代码回调示例for( $i = 1; $i <= 5; $i++ ) {
$cb = function() use ($i) {
return "<div>Route $i</div>";
};
add_shortcode( "route $i", $cb );
}
我不得不问:你能用短码参数完成你需要做的事吗?即。 [route num=3]
。然后你可以只有一个handle_route()
函数和一个[route]
短代码,这可以简化一些事情。
另外,虽然从技术上讲你可以在名称中包含一个带空格的短代码,但我认为它会产生令人困惑的歧义。如果您决定每条路线都需要特定的短代码,我建议使用“route5”或“route-5”而不是“route 5”。
答案 1 :(得分:3)
谢谢你们,终于搞定了。以下是将来可能需要它的任何人的代码:
function route_sc($atts, $content = null) {
extract(shortcode_atts(array(
'num' => '',
'bg' => '',
'text' => '',
), $atts));
global $wpdb;
$bus = $wpdb->get_row( $wpdb->prepare("SELECT * FROM wp_route WHERE id = '$num'") );
return "<div class='".$bus->text_colour."' style='background-color:".$bus->bg_colour."'>".$bus->route_id."</div></div>";
}
add_shortcode('route','route_sc');
使用[route num="5a"]
答案 2 :(得分:1)
PHP中无法使用动态函数名称。
但你可以试试eval。
eval('function route_sc'.$route->id.' () { return "<div>Route '.$route->id.'</div>"; }');
答案 3 :(得分:0)
以不同的方式进行:短代码可以采用参数。因此,而不是[route 5]
做[route rt="5"]
。这样,您的短代码处理功能保持通用,而更改的部分则是动态的。这也意味着如果在页面加载过程中遇到意外的短代码,你可以正确处理它而不是WordPress,只需剥离代码并替换它。
有关详细信息,请参阅此处:http://codex.wordpress.org/Shortcode_API