2010-08-23 11 views
2

J'ai un peu de problème avec les shortcodes autogénérés, basés sur les entrées de base de données.Shortcodes dynamiques et fonctions dans WordPress

Je suis en mesure d'obtenir un i.e. de travail normale shortcode:

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

et le shortcode suivant pour l'activer serait [route 5]

Cela fonctionne. Mais ce dont j'ai besoin, c'est le shortcode à produire pour chaque entrée de base de données. quelque chose comme:

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

Ce qui précède est juste un exemple de comment je veux que cela fonctionne. Pas littéralement le code que j'utilise. Comment pourrais-je y parvenir?): Merci.

+1

Pensez à demander à celui-ci sur le site wordpress.stackoverflow.com :-) –

+4

Vous voulez dire wordpress.stackexchange .com:: –

+0

merci, je ne savais pas qu'il y avait un forum wordpress comme celui-ci, bookmarked (Y) –

Répondre

2

Voici un exemple de callbacks shortcode dynamiques en 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); 
} 

Je dois demander, si: vous pouvez accomplir tout ce que vous devez faire en utilisant des arguments de shortcode? c'est à dire. [route num=3]. Alors vous pourriez juste avoir une fonction handle_route() et un [route] shortcode, qui peut simplifier des choses.

Aussi, bien que techniquement vous pouvez inclure un shortcode avec un espace dans le nom, je pense qu'il crée une ambiguïté confuse. Si vous décidez que vous avez besoin de shortcodes spécifiques pour chaque route, je recommanderais "route5" ou "route-5" plutôt que "route 5".

+0

Ce qui est réellement dans le

route $id
(comme ceci est juste un exemple) .. est un ensemble de divs qui a une classe définie à une valeur stockée dans la base de données, un style = backround couleur également mis à partir d'une valeur dans la base de données comme le nom de l'itinéraire de la base de données. avec une fonction hanle_route(), je ne comprends pas vraiment comment je pourrais tirer ces données sans que l'utilisateur doive faire quelque chose comme: [route num = 5 bgcolor = # 123456 class = W] mais je vais avoir un aller faire un tour pour voir si je peux le simplifier pour l'utilisateur autant que possible. –

1

Les noms de fonctions dynamiques ne sont pas possibles en PHP.

Mais vous pouvez essayer eval.

eval('function route_sc'.$route->id.'() { return "<div>Route '.$route->id.'</div>"; }'); 
+0

Les noms de fonctions dynamiques sont parfaitement possibles en PHP: "$ func = 'ma_fonction'; $ func();" –

+0

@Bobby Vous pouvez facilement appeler [fonctions variables] (http://php.net/manual/fr/functions.variable-functions.php), mais elles sont légèrement plus difficiles à créer. –

0

Procédez différemment: Les shortcodes peuvent prendre des paramètres. Donc, au lieu de [route 5] faire [route rt="5"]. De cette façon, votre fonction de traitement de shortcode reste générique et la partie qui change est destinée à être dynamique. Cela signifie également que si un shortcode inattendu est rencontré pendant le chargement de la page, vous pouvez le gérer correctement au lieu de simplement supprimer le code de WordPress et le remplacer par rien.

Voir ici pour plus d'informations: http://codex.wordpress.org/Shortcode_API

3

Merci les gars, a finalement obtenu fonctionner. voici le code pour any1 qui peuvent avoir besoin à l'avenir:

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

avec le shortcode à [route num="5a"]