Есть ли способ удалить стили, добавленные с помощью wp_add_inline_style?
Я заметил, что если я несколько раз назову wp_add_inline_style, он просто добавляет стиль, он не перезаписывает ранее добавленное.
Плагин добавляет стили:
$inline_css = '#selector{ color:red; }'; wp_add_inline_style($style, $inline_css);
Если я снова это сделаю:
$inline_css = '#other-selector{ color:blue; }'; wp_add_inline_style($style, $inline_css);
Он просто добавит эти css, я хотел бы очистить css перед вызовом wp_add_inline_style снова.
wp_add_inline_style()
Если мы хотим сохранить custom-style-css
но только удалим custom-style-inline-css
, тогда мы можем попробовать например
add_action( 'wp_print_styles', function() { // Remove previous inline style wp_styles()->add_data( 'custom-style', 'after', '' ); } );
где after
– ключ данных для встроенного стиля, соответствующего обработчику custom-style
.
Существует оболочка для wp_styles()->add_data()
, а именно wp_style_add_data()
.
Тогда мы могли бы определить вспомогательную функцию:
function wpse_remove_inline_style( $handler ) { wp_style_is( $handler, 'enqueued' ) && wp_style_add_data( 'custom-style', 'after', '' ); }
и используйте его так:
add_action( 'wp_print_styles', function() { // Remove previous inline style wpse_remove_inline_style( 'custom-style' ); } );
Я пропущу function_exists
здесь.
Чтобы переопределить встроенный стиль, добавленный другим плагином, с нашим собственным:
add_action( 'wp_print_styles', function() { // Remove previous inline style wpse_remove_inline_style( 'custom-style' ); // New inline style $custom_css = ".mycolor{ background: {blue}; }"; wp_add_inline_style( 'custom-style', $custom_css ); } );
Причина, почему это не работает, чтобы переопределить предыдущий встроенный стиль с помощью wp_add_inline_style()
состоит в том, что WP_Style::add_inline_style()
добавляет каждую входящую строку CSS в массив. Внутри он использует WP_Style::add_data()
для хранения накопленного CSS. Здесь мы используем его для преодоления ограничения на добавление wp_add_inline_style()
.
Заглянув в файл wp-includes/class.wp-styles.php
я нашел фильтр для использования:
add_action("print_styles_array", function( $styles ) { $my_handle = "custom-style"; // your custom handle here, the one declared as $style in question if ( !empty( $styles ) ) { foreach ( $styles as $i => $style ) { if ( $my_handle === $style ) { unset( $styles[$i] ); } } } return $styles; });
Обратите внимание, что это приведет к удалению всех встроенных стилей, обрабатываемых именем дескриптора.