Динамические коротководства и функции в WordPress
Вопрос
У меня есть немного проблемы с автогенерирующими шорткотами на основе записей базы данных.
Я могу получить нормальный шорткод, т.е.
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');
}
Выше находится просто пример того, как я хочу, чтобы он работал. Не буквально код, который я использую. Как бы я пошел в достижение этого? ): Спасибо.
Решение
Вот пример обратных вызовов динамического короткого кода с использованием PHP 5.3 анонимные функции:
for( $i = 1; $i <= 5; $i++ ) {
$cb = function() use ($i) {
return "<div>Route $i</div>";
};
add_shortcode( "route $i", $cb );
}
Я должен спросить, хотя: Можете ли вы просто сделать то, что вам нужно сделать, используя аргументы Shortcode? т.е. [route num=3]
. Отказ Тогда вы могли бы просто иметь один handle_route()
функция и один [route]
Шорткод, который может упростить вещи.
Кроме того, в то время как технически вы можете включить шорткод с пространством в названии, я думаю, что он создает смущенную двусмысленность. Если вы решаете, вам нужны определенные короткие коды для каждого маршрута, я бы порекомендовал «Route5» или «Маршрут-5», а не «Маршрут 5.»
Другие советы
Спасибо, ребята, наконец, получили это работать. Вот код для 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"]
Динамические имена функций невозможны в PHP.
Но вы можете попробовать Eval.
eval('function route_sc'.$route->id.' () { return "<div>Route '.$route->id.'</div>"; }');
Идите по этому другому способу: короткиекоды могут принимать параметры. Так вместо [route 5]
делать [route rt="5"]
. Отказ Таким образом, функция обработки шорткодов остается универсальной и часть, которую изменяется, предназначена для динамической. Это также означает, что если неожиданный шорткод встречается во время загрузки страницы, вы можете обрабатывать его правильно вместо WordPress, просто зачистите код и заменив его ничем.
Смотрите здесь для получения дополнительной информации: http://codex.wordpress.org/shortcode_api.