Dynamic shortcodes and functions in WordPress

2019-04-02 07:26发布

I am having a bit of an issue with autogenerating shortcodes, based on database entries.

I am able to get a normal shortcode working i.e:

function route_sc5() {
        return "<div>Route 5</div>";
    }
    add_shortcode('route 5','route_sc');

and the following shortcode to activate it would be [route 5]

This works. But what I need is the shortcode to be produced for each database entry. something like:

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

The above is just an example of how I want it to work. Not literally the code I am using. How would I go about achieving this? ): Thanks.

4条回答
forever°为你锁心
2楼-- · 2019-04-02 07:39

Dynamic function names are not possible in PHP.

But you could try eval.

eval('function route_sc'.$route->id.' () { return "<div>Route '.$route->id.'</div>"; }');
查看更多
男人必须洒脱
3楼-- · 2019-04-02 07:55

Thanks guys, finally got it working. here is the code for any1 who may need it in the future:

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

with the shortcode at [route num="5a"]

查看更多
Evening l夕情丶
4楼-- · 2019-04-02 07:56

Go about it a different way: Shortcodes can take parameters. So instead of [route 5] do [route rt="5"]. This way your shortcode processing function stays generic and the part that changes is meant to be dynamic. It also means that if an unexpected shortcode is encountered during the page load you can handle it properly instead of WordPress just stripping the code and replacing it with nothing.

See here for more info: http://codex.wordpress.org/Shortcode_API

查看更多
Bombasti
5楼-- · 2019-04-02 07:59

Here's an example of dynamic shortcode callbacks using 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 );
}

I have to ask, though: can you just accomplish what you need to do using shortcode arguments? ie. [route num=3]. Then you could just have one handle_route() function and one [route] shortcode, which may simplify things.

Also, while technically you can include a shortcode with a space in the name, I think it creates a confusing ambiguity. If you decide you need specific shortcodes for each route, I would recommend "route5" or "route-5" rather than "route 5."

查看更多
登录 后发表回答