WordPress: удалите # 038 из шорткода

Простой пример шорткода:

function s_print( $atts ){
    return 'http://abc.com/?foo=1&bar=2';
}
add_shortcode( 'my_shortcode', 's_print' );

И он возвращает:

http://abc.com/?foo=1&bar=2

Эта функция вставляет ссылку на тело страницы через шорткод [my_shortcode], но & всегда меняется на &#038, и это разрывает ссылку (она больше не работает). Я много гуглил. Есть несколько решений:

wp_specialchars_decode($foo);
remove_filter('the_content','wptexturize');

Но похоже, что они предназначены только для использования в теме (functions.php) и не работают для шорткода (я пробовал добавить его до или внутри функции шорткода).

Я не хочу останавливаться на последнем решении, которое комментирует некоторые строки в formatting.php файле WordPress, потому что я работаю над плагином, который будет использоваться многими людьми.


person Roman    schedule 13.12.2012    source источник


Ответы (3)


У меня была аналогичная проблема, которую я решил с помощью фильтра clean_url. См. Изменение в моем ответе здесь.

Этого не было в шорткоде, поэтому я не могу гарантировать, что он сработает в вашей конкретной ситуации. Хотя, возможно, стоит попробовать.

РЕДАКТИРОВАТЬ от oyatek (модифицированное решение по ссылке выше):

function so_handle_038($content) {
    $content = str_replace(array("&","&"), "&", $content); 
    return $content;
}
add_filter('the_content', 'so_handle_038', 199, 1);
person Hobo    schedule 13.12.2012
comment
Решение, описанное по ссылке, не сработало для шорткода, но я его немного изменил, и оно сработало! Бесконечно благодарен! Я думал, что это безнадежно! Разрешите добавить решение к вашему ответу. - person Roman; 13.12.2012
comment
Отлично; рад, что помог. - person Hobo; 13.12.2012
comment
В моем случае он работал с clean_url вместо the_content. Спасибо! - person chelder; 08.01.2015

Дело в том, что когда вы используете визуальный редактор, & будет изменен на &. Но если вы используете текстовый редактор, одиночный &, за которым не следует ни одного символа, останется прежним, а &sth будет изменен на &sth.

В целом & будет изменено на & или &. Думаю, решение выше:

function so_handle_038($content) {
    $content = str_replace(array("&","&"), "&", $content); 
    return $content;
}
add_filter('the_content', 'so_handle_038', 199, 1);

это своего рода перебор, потому что so_handle_038(); декодирует все & и & в $content, тогда как в вашем случае вам нужно декодировать только те, которые находятся в массиве $atts. Ваш шорткод, вероятно, будет таким:

[my_shortcode url="http://abc.com/?foo=1&bar=2" /]

и $atts будет:

array( 'url' => "http://abc.com/?foo=1&bar=2" )

or:

array( 'url' => "http://abc.com/?foo=1&bar=2" )

так что вам нужно только декодировать $atts['url']:

html_entities_decode($atts['url']);

прежде чем пытаться что-либо с ним сделать.

person samluthebrave    schedule 28.07.2013

Это был хак с бандажом, который я использовал, в основном, чтобы исправить проблему в wordpress (поскольку у меня была ссылка внутри iFrame), я пошел в Bitly и создал ссылку БЕЗ амперсанда и знака! Итак, наконец, я получил ссылку, на которой НЕ было никаких знаков &, но ВСЕ ЕЩЕ указывала на то же место (плюс я получил бесплатное отслеживание через Bit.ly для ссылки, так что ДВОЙНОЙ бонус, поскольку я могу проверить, сколько раз ссылка был нажат). Не лучшее решение, но, черт возьми, оно сработало для меня, и мне не пришлось тратить время на поиски другого решения для символа & в Wordpress.

person Abhinav    schedule 04.12.2015