2

我在根据数据库条目自动生成简码时遇到了一些问题。

我能够获得正常的简码工作,即:

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');
}

以上只是我希望它如何工作的一个例子。不是我正在使用的代码。我将如何实现这一目标?): 谢谢。

4

4 回答 4

4

这是使用 PHP 5.3匿名函数的动态短代码回调示例:

for( $i = 1; $i <= 5; $i++ ) { 
    $cb = function() use ($i) {
        return "<div>Route $i</div>";
    };  

    add_shortcode( "route $i", $cb );
}

不过,我不得不问:你能用简码参数完成你需要做的事情吗?IE。[route num=3]. 然后你可以只拥有一个handle_route()功能和一个[route]简码,这可以简化事情。

此外,虽然从技术上讲,您可以在名称中包含一个带有空格的简码,但我认为它会产生令人困惑的歧义。如果您决定每条路线都需要特定的短代码,我会推荐“route5”或“route-5”而不是“route 5”。

于 2010-08-23T12:50:10.243 回答
3

谢谢各位,终于搞定了。这是将来可能需要它的any1的代码:

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"]

于 2010-08-23T15:59:11.450 回答
1

动态函数名在 PHP 中是不可能的。

但是你可以试试eval。

eval('function route_sc'.$route->id.' () { return "<div>Route '.$route->id.'</div>"; }');
于 2010-08-23T10:09:16.597 回答
0

换一种方式去做:简码可以带参数。所以而不是[route 5]do [route rt="5"]。这样,您的简码处理功能将保持通用性,而更改的部分将是动态的。这也意味着如果在页面加载过程中遇到意外的短代码,您可以正确处理它,而不是 WordPress 只是剥离代码并将其替换为任何内容。

有关更多信息,请参见此处:http: //codex.wordpress.org/Shortcode_API

于 2010-08-23T14:10:15.937 回答