Динамические шорткоды и функции в WordPress - PullRequest
2 голосов
/ 23 августа 2010

У меня возникла небольшая проблема с автоматическим генерированием коротких кодов, основанных на записях базы данных.

Я могу получить работающий нормальный шорткод, например:

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 ]

3 голосов
/ 23 августа 2010

Спасибо, ребята, наконец-то все заработало. Вот код для любого1, кому это может понадобиться в будущем:

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

3 голосов
/ 23 августа 2010

Вот пример динамического обратного вызова шорткода с использованием PHP 5.3 анонимных функций :

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

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

Я должен спросить, хотя: можете ли вы просто выполнить то, что вам нужно сделать, используя аргументы шорткода?то есть.[route num=3].Тогда вы могли бы просто иметь одну handle_route() функцию и один [route] шорткод, что может упростить вещи.

Кроме того, хотя технически вы можете включить шорткод с пробелом в имени, я думаю, это создает путаницунеоднозначность.Если вы решите, что вам нужны определенные шорткоды для каждого маршрута, я бы порекомендовал «route5» или «route-5», а не «route 5».

1 голос
/ 23 августа 2010

Имена динамических функций в PHP невозможны.

Но вы можете попробовать eval.

eval('function route_sc'.$route->id.' () { return "<div>Route '.$route->id.'</div>"; }');
0 голосов
/ 23 августа 2010

Идите по-другому: шорткоды могут принимать параметры. Так что вместо [route 5] делай [route rt="5"]. Таким образом, ваша функция обработки шорткода остается общей, а изменяемая часть должна быть динамичной. Это также означает, что если неожиданный шорткод встречается во время загрузки страницы, вы можете обрабатывать его правильно, а не WordPress, просто удаляя код и ничего не заменяя.

Смотрите здесь для получения дополнительной информации: http://codex.wordpress.org/Shortcode_API

...