Многие плагины для WordPress используют шорткоды для форматирования текста, для вывода форм и для иного функционала. Одна из частых проблем с шорткодами возникает в момент деактивации подобного плагина, что приводит к публикации шорткодов в открытом (или в «битом») виде.
Например вместо формы обратной связи, вы на ее месте увидите [contact-form]. Конечно можно пройтись по всем записям и страницам вручную, и удалить или поменять подобный шорткод, но если речь идет о большом количестве страниц и/или шорткодов, то есть куда более эффективные методы.
Hide Broken Shortcodes
Плагин Hide Broken Shortcodes создан именно для решения этой проблемы. Он сканирует выводимый текст в записях и страницах на битые шорткоды и скрывает их, причем это происходит только при выводе, а оригинал содержимого плагин не меняет.
При использовании этого плагина необходимо учитывать, что если битый шорткод используется вокруг какого-либо текста, то при его скрытии, текст остается видимым. Такой подход не совсем применим к шорткодам, цель которых скрыть часть текста, например до регистрации пользователя на сайте:
[hide-unregistered] Ссылка на скачивание: ... [/hide-unregistered]
Если вам необходима специальная обработка для подобных шорткодов, то рекомендуем делать это с помощью собственного небольшого плагина.
Собственный плагин
Чтобы полностью скрыть содержимое определенного шорткода в WordPress, достаточно добавить на него обработчик, который возвращает пустую строку. Вспомогательная функция __return_empty_string
позволит сделать это красиво одной строкой:
add_shortcode( 'foo', '__return_empty_string' );
Можно также повесить данный шорткод на обработчик другого шорткода, если нам известна его функция:
add_shortcode( 'foo', 'my_other_shortcode_handler' );
Если мы не имеем прямого доступа к функции обработки стороннего шорткода, то можно воспользоваться функцией do_shortcode()
внутри нашего собственного небольшого обработчика. Учтите, что это будет немного медленнее, чем обращение к функции обработки напрямую.
add_shortcode( 'foo', function( $attr, $content = '' ) { return do_shortcode( '[my-other-shortcode]' ); });
Такой подход позволяет не только заменять обработку одного шорткода другим, но и управлять всеми атрибутами, и передавать их новому обработчику.
Например, если наш битый шорткод поддерживал атрибуты width
и height
для указания ширины и высоты, а новый шорткод поддерживает лишь атрибуты w
и h
, то в нашем обработчике мы можем написать для этого совместимость:
add_shortcode( 'foo', function( $attr, $content = '' ) { $attributes = ''; if ( ! empty( $attr['width'] ) ) $attributes .= sprintf( ' w="%d" ', $attr['width'] ); if ( ! empty( $attr['height'] ) ) $attributes .= sprintf( ' h="%d" ', $attr['height'] ); return do_shortcode( "[my-other-shortcode {$attributes}]" ); });
Для более сложных случаев конечно придется писать более сложную логику, и иногда это не совсем оправдано. Если шорткод используется лишь пару раз — проще найти его и вручную заменить.
Как вы справляетесь с битыми шорткодами в WordPress? Оставьте ваше мнение в комментариях, или напишите нам в Твиттер.