Как скрыть битые шорткоды в WordPress

Многие плагины для WordPress используют шорткоды для форматирования текста, для вывода форм и для иного функционала. Одна из частых проблем с шорткодами возникает в момент деактивации подобного плагина, что приводит к публикации шорткодов в открытом (или в «битом») виде.

Например вместо формы обратной связи, вы на ее месте увидите [contact-form]. Конечно можно пройтись по всем записям и страницам вручную, и удалить или поменять подобный шорткод, но если речь идет о большом количестве страниц и/или шорткодов, то есть куда более эффективные методы.

Hide Broken Shortcodes

Плагин Hide Broken Shortcodes создан именно для решения этой проблемы. Он сканирует выводимый текст в записях и страницах на битые шорткоды и скрывает их, причем это происходит только при выводе, а оригинал содержимого плагин не меняет.

Плагин 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? Оставьте ваше мнение в комментариях, или напишите нам в Твиттер.

Павел Федоров

Создатель этого сайта и многих других (на WordPress, конечно же). Любит WordPress и делает на нем всякие сумасшедшие сложные штуки, которые никто в здравом уме делать не станет. Умеет работать на фрилансе, в офисе, без офиса, без оглядки и без сна. Один из немногих участников программы FSA/FLEX, кого выдворили из Америки за плохое поведение. С тех пор умеет слушать. Обожает Star Wars, Ведьмака, горные лыжи, байдарку, пешие прогулки, спонтанные путешествия и хорошую компанию. Больше не боится vim.

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

%d такие блоггеры, как: