className не заполняется в пользовательском блоке

Вопрос или проблема

Я создаю пользовательский плагин блока, и у меня возникли некоторые трудности с тем, чтобы имя класса появлялось в теге, выходящем из функции сохранения.

Моя функция редактирования использует return() и передает это:

<>
    <div className={className}>
        <RichText
            tagName="a"
            //
            placeholder={__("Добавьте текст…", plugin.slug)}
            value={text}
            //
            formattingControls={["жирный", "курсив", "зачеркнутый"]}
            //
            onChange={this.onChangeContent}
            //
        />
    </div>
</>

И в моей функции сохранения я также использую return() и пытался передать ряд вариантов, описанных ниже.

Прямое использование RichText.Content:

<RichText.Content
    tagName="a"
    value={text}
    className={className}
/>

С линией className или без нее, это сохраняет <a class="…">Текст демо</a> в базе данных.
Это ожидалось, однако мне нужно обернуть тег ссылки в что-то еще.

Использование обертки:

<>
    <RichText.Content
        tagName="a"
        value={text}
        className={className}
    />
</>

Выше я обернул тег a в <> и </>, но с линией className или без нее, имя класса не заполняется в функции сохранения. <a>Текст демо</a> всегда сохраняется в базе данных.

Использование div:

<div>
    <RichText.Content
        tagName="a"
        value={text}
        className={className}
    />
</div>

Выше я обернул тег a в <div> и </div>, но с линией className или без нее в теге RichText, имя класса заполняется только в div теге при сохранении в базе данных. <div class="…"><a>Текст демо</a></div> всегда сохраняется в базе данных.

То же самое происходит, когда я переключаюсь с тега a на тег p.

  • Есть ли способ получить имя класса для тегов, обёрнутых в другие теги?
  • Или у кого-то есть ссылка на более подробную информацию о том, как работает имя класса?

Спасибо!
Дейл.

Я тоже пытался разобраться с этим весь день и понял, что имя класса передается по умолчанию в функции сохранения для корня определенных элементов.

Например, в следующем примере кода, где имя класса warning

return (
<div className="other-class-name" value={ props.attributes.content } />;

вернет элемент на фронтэнде

<div class="wp-block-block-name is-warning other-class-name">

https://developer.wordpress.org/block-editor/developers/block-api/block-registration/#supports-optional содержит дополнительную информацию

Ответ или решение

Проблема: Не заполняется className в пользовательском блоке

Здравствуйте, Дейл.

Вы столкнулись с распространенной проблемой при разработке пользовательских блоков для редактора Gutenberg: класс className не появляется в ожидаемых тегах. Давайте подробно рассмотрим вашу ситуацию и найдем оптимальное решение.

Описание проблемы

В вашем коде, как вы указали, вы пытаетесь применить класс к тегам <a> или <p>, оборачивая их в другие HTML-теги. Однако класс не сохраняется в целевых тегах на выходе функции save. Рассмотрим вашу реализацию:

  1. Использование RichText.Content:

    <RichText.Content tagName="a" value={text} className={className} />

    Этот подход корректно сохраняет класс в тег <a>, но его невозможно обернуть.

  2. Оборачивание тегами <></>:

    <>
      <RichText.Content tagName="a" value={text} className={className} />
    </>

    Даже в этом случае класс не сохраняется в нужном теге.

  3. Использование <div> как обертки:

    <div>
      <RichText.Content tagName="a" value={text} className={className} />
    </div>

    Здесь класс появляется только на обертывающем элементе <div>, но не распространяется на <a>.

Причины

Причина, по которой класс не появляется в не-основных тегах, заключается в том, что Gutenberg обрабатывает className только для корневого элемента блока. Это проектное решение, которое гарантирует, что стили корректно применяются именно к основному контейнеру блока.

Решение

Для достижения вашей цели — наличия класса в тегах обертки с текстом — имеются несколько альтернатив:

  1. Классы в родительском элементе:
    Используйте родительский элемент для применения классов, а внутри него размещайте необходимые теги. Это гарантирует, что стили применяются ко всему блоку, а не только к отдельному тегу.

    return (
       <div className={className}>
           <RichText.Content tagName="a" value={text} />
       </div>
    );
  2. Кастомизация через атрибуты:
    Если вам нужно применить уникальное оформление для внутреннего тега, вы можете использовать атрибуты data-*, чтобы передавать дополнительные стили через JavaScript или CSS.

  3. Использование стилей через CSS:
    Если это единственный тег, который вам нужно стилизовать, рассмотрите возможность применения некоторых стилей к родительскому элементу, используя селекторы CSS.

    .custom-class a {
       color: red; /* Пример применения стилей к тегу <a> внутри обертки */
    }

Заключение

К сожалению, механизм Gutenberg ограничивает возможность применения классов к определенным внутренним тегам. Однако, вы можете обойти это ограничение, корректно применяя стили к родительским элементам. Для более детальной информации о поддерживаемых атрибутах и классах рекомендую изучить документацию на сайте разработчиков WordPress.

Если у вас есть дополнительные вопросы или нужна дальнейшая помощь, не стесняйтесь обращаться!

С уважением,
[Ваше имя]
IT-эксперт по разработке блоков для Gutenberg

Оцените материал
Добавить комментарий

Капча загружается...