문제

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.

도움이 되었습니까?

해결책

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

다른 팁

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

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top