remove_filter ('the_content', 'wpautop') не работает
Я пытаюсь отключить автоматическое добавление параграфов в WordPress с помощью:
remove_filter ('the_content', 'wpautop');
но мой контент всё равно оборачивается в автоматические теги <p>
... Что я делаю не так?
Код находится в конце файла functions, но не в functions.php, а в файле, который подключается через functions.php (и размещение кода непосредственно в functions.php не меняет ситуацию).
Обновление:
var_dump( $wp_filter['the_content'] );
выводит NULL
. Как я могу проверить, почему этот фильтр не срабатывает?
Если вы используете плагин TinyMCE Advanced, попробуйте снять галочку с этой расширенной настройки:
Прекратить удаление тегов <p> и <br /> при сохранении и показывать их в HTML-редакторе
Отключение этой опции и использование кода remove_filter ('the_content', 'wpautop');
в файле functions.php решило мою проблему.

Ваш код абсолютно верный. Вы можете попробовать этот фрагмент в шаблоне, чтобы убедиться, что фильтр действительно удаляется:
var_dump( $wp_filter['the_content'] );
Если фильтр не удаляется, возможно, код не доходит до вашего удаления фильтра (например, из-за return
выше по коду) или фильтр позже снова добавляется другим кодом.

или попробуйте изменить приоритет фильтра, по умолчанию он равен 10

@Ambitious Amoeba не совсем понимаю, что вы имеете в виду? Приоритет должен точно совпадать для работы remove_filter()
.

да, но если вы добавляете фильтр с приоритетом 20, разве вы не должны удалять его с тем же приоритетом? возможно, autop добавляется с другим приоритетом...

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

var_dump( $wp_filter['the_content'] );
выводит NULL
. Я попытался найти wpautop
через grep, но, судя по всему, ни один из php-файлов в wp-content не содержит этого, кроме моей строки кода.

@Amanda Если вы вызываете эту строку внутри какой-либо функции, не забудьте добавить global $wp_filter;
. wpautop
настраивается в wp-includes\default-filters.php
.

@Rarst - Я вставил var_dump в header.php, сразу после вывода меню...

@Rarst - чёрт, я разместил его вне цикла. Он возвращает кучу данных... включая shortcode_unautop
, но ничего больше про autop я не увидел

Ты пробовал понизить приоритет с 10 (по умолчанию) до 1, как советовал One Trick Pony?

Удалите shortcode_unautop, у меня самого была такая проблема, это preg_replace в этом фильтре возвращает NULL из-за ошибки.

Я согласен с теми, кто предлагает изменить приоритет фильтра. Повысьте его до 11, или 20, или даже 99, просто чтобы проверить, действительно ли проблема в приоритете.

Я пробовал remove_filter ('the_content', 'wpautop', 99);
и remove_filter ('the_content', 'wpautop', 1);
- без изменений.

@Backie добавил remove_filter ('the_content', 'wpautop');
remove_filter ('the_content', 'shortcode_unautop');
- без изменений. Пробовал с приоритетами 1 и 99 - без изменений.

Ничего из этого не работает для меня. Это невероятно разочаровывает. Мне нужно, чтобы теги <p> не оборачивали скрипты, динамически генерируемые шорткодом и поэтому не подключаемые через enqueue. Чёрт возьми, Wordpress, хватит изменять мой код! Почему так сложно просто сказать: "Эй, я программист, а не ты! Не создавай код, *я* это сделаю!"

Моя проблема возникла при разработке шорткода. Благодарность Самуэлю Вуду. Вот его совет:
И если вы вставляете шорткоды, используйте блок шорткода вместо того, чтобы вводить их в блок P. Тогда у вас не будет оберточных тегов P.
https://wordpress.org/support/topic/wpautop-not-working-on-wp_editor/
