Отключить автоматическое форматирование внутри шорткодов WordPress - PullRequest
21 голосов
/ 09 мая 2011

Я видел учебники по созданию [сырого] шорткода, который оставляет код в нем нетронутым,

http://www.wprecipes.com/disable-wordpress-automatic-formatting-on-posts-using-a-shortcode

, но, к сожалению, это относится только к 1 шорткоду за раз... И, б / с, оператор else обходит обычные фильтры и вызывает направления функций, мои другие модификации функций autop и texturize игнорируются.

есть ли способ 1. сопоставить несколько шорткодов и 2. сохранить мои другие фильтры добавления / удаления в the_content?

Ответы [ 4 ]

45 голосов
/ 04 февраля 2013

После внедрения решения @ helgatheviking на нескольких веб-сайтах я убежден, что требуются только эти строки:

//move wpautop filter to AFTER shortcode is processed
remove_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'wpautop' , 99);
add_filter( 'the_content', 'shortcode_unautop',100 );

Поместите их в файл functions.php и все готово.

8 голосов
/ 26 июля 2011

решил это как можно лучше, комбинируя слегка измененную функцию parse_shortcode_content от Донала МакАртура (его изначально вручную вызывается wpautop ... который я удалил. С переупорядочением фильтров по умолчанию для запуска wpautop гораздо позже ... после того, как шорткод уже обработан вместо ранее.

//Clean Up WordPress Shortcode Formatting - important for nested shortcodes
//adjusted from http://donalmacarthur.com/articles/cleaning-up-wordpress-shortcode-formatting/
function parse_shortcode_content( $content ) {

   /* Parse nested shortcodes and add formatting. */
    $content = trim( do_shortcode( shortcode_unautop( $content ) ) );

    /* Remove '' from the start of the string. */
    if ( substr( $content, 0, 4 ) == '' )
        $content = substr( $content, 4 );

    /* Remove '' from the end of the string. */
    if ( substr( $content, -3, 3 ) == '' )
        $content = substr( $content, 0, -3 );

    /* Remove any instances of ''. */
    $content = str_replace( array( '<p></p>' ), '', $content );
    $content = str_replace( array( '<p>  </p>' ), '', $content );

    return $content;
}

и перемещение фильтров

//move wpautop filter to AFTER shortcode is processed
remove_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'wpautop' , 99);
add_filter( 'the_content', 'shortcode_unautop',100 );

РЕДАКТИРОВАТЬ:

Функция parse_shortcode_content() больше не требуется (если она когда-либо была). Просто настройте порядок фильтра.

5 голосов
/ 05 ноября 2015

В моем случае - это решение сломало один из боковых шорткодов (revslider). Итак, я нашел другое решение здесь: http://wordpress -hackers.1065353.n5.nabble.com / шорткод-unautop-tp42085p42086.html который должен использовать другой фильтр, как это:

// via http://www.wpexplorer.com/clean-up-wordpress-shortcode-formatting/
if ( !function_exists('wpex_fix_shortcodes') ) {
    function wpex_fix_shortcodes($content){
        $array = array (
            '<p>[' => '[',
            ']</p>' => ']',
            ']<br />' => ']'
        );
        $content = strtr($content, $array);
        return $content;
    }
    add_filter('the_content', 'wpex_fix_shortcodes');
}

У меня отлично работает :) 1007 *

1 голос
/ 14 декабря 2015

Пожалуйста, смотрите мой ответ здесь: https://wordpress.stackexchange.com/questions/55782/remove-wpautop-from-shortcode-content-remove-whitespace-in-buffering/211784#answer-211784

Это позволяет вам отключить wpautop на столько конкретных шорткодов, сколько вы хотите, используя:

include "shortcode-wpautop-control.php";
chiedolabs_shortcode_wpautop_control(array('shortcodeone', 'shortcodetwo'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...