Динамические коротководства и функции в WordPress

StackOverflow https://stackoverflow.com/questions/3546512

  •  30-09-2019
  •  | 
  •  

Вопрос

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

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

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top