Поддержка Проблемы и решения Как правильно создать шорткод?

  • Всем привет, создаю свой первый wordpress плагин. И возникает ошибка с шорткодом. У меня есть таблица, где выводится имя блока и название шорткода. И также есть html код, который хранится в mySQL.

    View post on imgur.com


    https://i.stack.imgur.com/rqVp7.png
    Когда я создаю функцию шорткода, я передаю в нее третий параметр $name — имя шорткода и обратно возвращаю html текст из базы данных.

    global $wpdb;
    $table_name = "{$wpdb->prefix}blocks";
    $resultName = $wpdb->get_col("SELECT <code>NAME</code> FROM $table_name");
    $resultHtmltext = $wpdb->get_col("SELECT <code>HTMLTEXT</code> FROM $table_name");
    
    foreach ($resultName as $nameValue) {
      $name = $nameValue;
    }
    foreach ($resultHtmltext as $htmltextValue) {
      $htmltext = $htmltextValue;
    }
    function wpblocks_block_shortcode($atts, $content, $name)
    {
      global $htmltext;
      return $htmltext;
    }
    add_shortcode($name, 'wpblocks_block_shortcode');

    и когда я ввожу этот шорткод в записи [div-red], получаю следующее:
    https://i.stack.imgur.com/rG0H4.png

    После создаю следующий блок – шортокод работает, но уже перезаписывает предыдущий и предыдущий не работает а выводит просто [div-red]. Я понимаю почему да, потому что я принимаю только первый элемент из того массива. И тут возникает вопрос, как сделать так, чтобы имя шорткода в аргументе было любое, которое есть в данном массиве и соответственно я так же мог бы взять htmltext из БД таблицы где name = $name

    • Тема изменена 2 года, 4 месяца назад пользователем sensei07.
Просмотр 1 ответа (всего 1)
  • Модератор Yuri

    (@yube)

    первый wordpress плагин

    Подозреваю, что с mysql тоже впервые имеете дело 😉

    Вот где-то так:

    
    add_action('init', function() {
        global $wpdb;
        $shortcodes = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}blocks");
        if ( ! empty($shortcodes) ) foreach ( $shortcodes as $shortcode ) {
            add_shortcode( $shortcode->name, function() use ($shortcode) {
                return $shortcode->htmltext;
            });
        }
    });
    

    Писано на коленке, без проверки, исключительно для иллюстрации подхода.

    • Ответ изменён 2 года, 4 месяца назад пользователем Yuri.
    • Ответ изменён 2 года, 4 месяца назад пользователем Yuri.
Просмотр 1 ответа (всего 1)
  • Тема «Как правильно создать шорткод?» закрыта для новых ответов.