Добавьте атрибут ‘title’ к таблицам стилей с помощью wp_enqueue_style()

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

Читать ниже, если вы хотите начать с того места, на котором я остановился в ядре. Но основной вопрос таков: мне нужно добавить атрибут “title” в мои таблицы стилей, и wp_enqueue_style() не позволяет использовать этот параметр, насколько я понимаю. Кроме жесткой вставки, есть ли способы, которые WordPress позволяет использовать для добавления заголовка к таблице стилей?

При исследовании ядра я заметил, что есть переменная $title, которую можно установить с помощью $style->extra['title'].

$title = isset($this->registered[$handle]->extra['title']) ? "title="" . esc_attr( $this->registered[$handle]->extra["title'] ) . "'" : '';

(class.wp-styles.php)

И $title также фигурирует в фильтре, который применяется при добавлении таблицы стилей. Как вы можете установить этот ‘extra’ массив внутри объекта стиля?

Хорошо, вот где я нахожусь с решением.

wp_enqueue_style( 'my-handle', 'mystyle.css' );
global $wp_styles;
$wp_styles->add_data( 'my-handle', 'title', 'my_stylesheet_title' );

Не люблю использовать глобальные переменные. Есть что-то лучше?

Мне кажется, вы также можете использовать style_loader_tag, посмотрите мой другой ответ для более подробного объяснения как style_loader_tag, так и script_loader_tag API:
Как добавить crossorigin и integrity в wp_register_style? (Font Awesome 5)

style_loader_tag — это официальный API WordPress, смотрите документацию: https://developer.wordpress.org/reference/hooks/style_loader_tag/

apply_filters( 'style_loader_tag', $html, $handle, $href, $media )
Фильтрует HTML-тег ссылки для добавленной
таблицы стилей.

Сначала добавьте ваши таблицы стилей

function add_styles() {
    // Пример загрузки внешней таблицы стилей, может использоваться как в теме, так и в плагине
    wp_enqueue_style( 'font-awesome-5', 'https://use.fontawesome.com/releases/v5.5.0/css/all.css', array(), null );

    // Пример темы
    wp_enqueue_style( 'font-awesome-5', get_theme_file_uri( '/assets/css/fontawesome.min.css' ), array(), null );

    // Пример плагина
    wp_enqueue_style( 'font-awesome-5', plugins_url( '/assets/css/fontawesome.min.css', __FILE__ ), array(), null );
};
add_action( 'wp_enqueue_scripts', 'add_styles' );

Во-вторых, используйте style_loader_tag
Затем используйте style_loader_tag, чтобы добавить ваш заголовок в конкретную таблицу стилей.

function add_stylesheet_attributes( $html, $handle ) {
    if ( 'font-awesome-5' === $handle ) {
        return str_replace( "rel="stylesheet"", "rel="stylesheet" title="something"", $html );
    }
    return $html;
}
add_filter( 'style_loader_tag', 'add_stylesheet_attributes', 10, 2 );

Смотря на файл, который вы упомянули в своем посте class.wp-styles.php, у вас есть следующая строка: $tag .= apply_filters( 'style_loader_tag', "<link rel="$rel" id='$handle-css' $title href="https://wordpress.stackexchange.com/questions/34754/$href" type="text/css" media="$media" />\n", $handle );. Таким образом, вы можете подключиться к фильтру “style_loader_tag” и добавить тег заголовка. Мне тоже нравится ваш ответ, но я не уверен, какой из них будет лучше, так как я не знаю, есть ли проблемы с использованием глобальной переменной или нет.

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

// Добавление стиля
wp_enqueue_style( 'twentytwelve-style-Xstyle1', get_stylesheet_uri() );

// моя фильтр-функция
add_filter('style_loader_tag', 'my_style_loader_tag_function');

function my_style_loader_tag_function($tag){
    $customXML = new SimpleXMLElement($tag);
    $id = (string)$customXML->attributes()->id;
    $values = explode('-X',$id);
    if(!isset($values[1])){
        return $tag;
    }
    $customXML->attributes()->id = $values[0].'-css';
    $title = str_replace('-css', '', $values[1]);
    $customXML->addAttribute('title', $title);
    $dom = dom_import_simplexml($customXML);

    return $dom->ownerDocument->saveXML($dom->ownerDocument->documentElement);
}

Таким образом, я ищу -X, и все, что следует за этой строкой, — это мой атрибут заголовка.

вы можете использовать wp_style_add_data('handler', attr, 'val')

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

Чтобы добавить атрибут title к таблицам стилей в WordPress с использованием функции wp_enqueue_style(), существует несколько подходов. Как вы заметили, данный параметр не поддерживается напрямую в функции wp_enqueue_style(). Однако благодаря различным хукам и методам, доступным в WordPress, можно добиться желаемого результата.

Подход 1: Использование глобальной переменной

Наиболее прямолинейный способ — это использование глобальной переменной $wp_styles для добавления данных стиля. Вот как это можно сделать:

function enqueue_my_styles() {
    wp_enqueue_style('my-style-handle', 'path/to/mystyle.css');

    // Получаем доступ к глобальной переменной
    global $wp_styles;
    $wp_styles->add_data('my-style-handle', 'title', 'My Stylesheet Title');
}
add_action('wp_enqueue_scripts', 'enqueue_my_styles');

Хотя этот метод работает, и он достаточно простой, многие разработчики предпочитают избегать использования глобальных переменных из соображений чистоты кода.

Подход 2: Использование фильтра style_loader_tag

Более элегантный способ — использование фильтра style_loader_tag, что делает ваш код более гибким и чистым. Фильтр позволяет модифицировать HTML-тег для загруженных стилей.

Вот пример, как это можно реализовать:

function enqueue_my_styles() {
    wp_enqueue_style('my-style-handle', 'path/to/mystyle.css');
}
add_action('wp_enqueue_scripts', 'enqueue_my_styles');

function add_title_to_stylesheet($html, $handle) {
    if ('my-style-handle' === $handle) {
        // Добавляем атрибут title к тегу link
        return str_replace('rel=\'stylesheet\'', 'rel=\'stylesheet\' title=\'My Stylesheet Title\'', $html);
    }
    return $html;
}
add_filter('style_loader_tag', 'add_title_to_stylesheet', 10, 2);

В этом коде, после того как мы зарегистрировали наш стиль, мы используем фильтр style_loader_tag для модификации HTML-кода, добавляя атрибут title.

Подход 3: Использование wp_style_add_data()

Еще один способ заключается в использовании функции wp_style_add_data(), которая позволяет добавлять дополнительные данные к стилям до их рендеринга. Этот метод предпочтителен так как он не использует глобальные переменные и поддерживает хорошую читаемость кода:

function enqueue_my_styles() {
    wp_enqueue_style('my-style-handle', 'path/to/mystyle.css');

    // Используем функцию wp_style_add_data
    wp_style_add_data('my-style-handle', 'title', 'My Stylesheet Title');
}
add_action('wp_enqueue_scripts', 'enqueue_my_styles');

Этот метод позволяет вам добавлять любые дополнительные атрибуты, обеспечивая чистоту и ясность вашей реализации.

Заключение

Из всех представленных способов, использование style_loader_tag и wp_style_add_data() являются наиболее рекомендованными из-за их ясности и безопасности. Оба метода не требуют использования глобальных переменных и обеспечивают более чистую архитектуру кода.

Независимо от того, что вы выберете, важно следить за тем, чтобы код оставался чистым и поддерживаемым в будущем. Это особенно актуально, если ваш проект имеет потенциал для роста и расширения.

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

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