Не удается удалить шорткод игрока JW?
В шаблоне архива WordPress я использую пользовательскую функцию извлечения, которая включает ссылку на strip_shortcodes()
. По какой-то причине короткие коды отображаются и отображаются в архиве.
Пример: http://arisehub.org/blog/page/2/
Прокрутите вниз, чтобы "Спеть новую песню с Джошуа Каннингемом"
Обратите внимание на отображаемый код скрипта. Это ссылка на шорткод для JW-плеера, отображаемый в отрисованном виде.
Вот код, который я используется для пользовательской функции извлечения.
function custom_excerpt($length, $more_text) {
global $post;
$text = get_the_content();
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$text = strip_tags($text, '<a>, <p>, <strong>, <em>, <b>');
if(!empty($length)){
$excerpt_length = apply_filters('excerpt_length', $length);
} else {
$excerpt_length = apply_filters('excerpt_length', 180);
}
if(!empty($more_text)){
$excerpt_more = apply_filters('excerpt_more', ' ' . '… <br /><a href="'.get_permalink($post->id).'" class="more-link">'.$more_text.'</a>');
} else {
$excerpt_more = apply_filters('excerpt_more', ' ' . '…<a href="'.get_permalink($post->id).'" class="more-link">+ more</a>');
}
$words = preg_split('/(<a.*?a>)|\n|\r|\t|\s/', $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE );
if ( count($words) > $excerpt_length ) {
array_pop($words);
$text = implode(' ', $words);
$text = $text . $excerpt_more;
} else {
$text = implode(' ', $words);
}
$output = '<p>'.$text.'</p>';
echo $output;
}
Есть идеи?
5 answers
Плагин JW Player для WordPress не регистрирует свой шорткод, как и все другие шорткоды, поэтому strip_shortcodes()
не узнает об этом и не удалит его. В коде есть примечание, что это связано с тем, что он использует имена аргументов с .
в нем, и WordPress не поддерживает это.
Вероятно, есть несколько способов решить эту проблему, но я бы скопировал соответствующую строку из strip_shortcodes()
и интегрировал регулярное выражение из плагина:
function custom_excerpt( $length, $more_text ) {
global $post;
$text = get_the_content();
$text = strip_shortcodes( $text );
// Strip JW Player shortcode too
$text = preg_replace( '/(.?)\[(jwplayer)\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)/s', '$1$6', $text );
$text = apply_filters('the_content', $text);
// Continue with the rest of your function ...
На странице кодекса есть функция для strip_shortcodes, которая делает то, что вам нужно:
function remove_shortcode_from_index($content) {
if ( is_home() ) {
$content = strip_shortcodes( $content );
}
return $content;
}
add_filter('the_content', 'remove_shortcode_from_index');
В вашем случае вы бы применили его к своей странице архивов или где угодно еще.
Попробуйте выполнить приведенный ниже код. Он добавит фильтр для удаления коротких кодов только при вызове вашей функции custom_excerpt
. Остальная часть вашего сайта не будет затронута. Я не уверен, как ваша функция get_the_content
извлекает содержимое. Так что этот фильтр тоже позаботится об этом.
function my_strip_jwplayer( $content ) {
$content = strip_shortcodes( $content );
return $content;
}
function custom_excerpt($length, $more_text) {
global $post;
// add a custom filter
add_filter('the_content', 'my_strip_jwplayer', 10);
$text = get_the_content();
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$text = strip_tags($text, '<a>, <p>, <strong>, <em>, <b>');
if(!empty($length)){
$excerpt_length = apply_filters('excerpt_length', $length);
} else {
$excerpt_length = apply_filters('excerpt_length', 180);
}
if(!empty($more_text)){
$excerpt_more = apply_filters('excerpt_more', ' ' . '… <br /><a href="'.get_permalink($post->id).'" class="more-link">'.$more_text.'</a>');
} else {
$excerpt_more = apply_filters('excerpt_more', ' ' . '…<a href="'.get_permalink($post->id).'" class="more-link">+ more</a>');
}
$words = preg_split('/(<a.*?a>)|\n|\r|\t|\s/', $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE );
if ( count($words) > $excerpt_length ) {
array_pop($words);
$text = implode(' ', $words);
$text = $text . $excerpt_more;
} else {
$text = implode(' ', $words);
}
$output = '<p>'.$text.'</p>';
echo $output;
}
Просто собираюсь сделать снимок в темноте здесь, но после просмотра вашего кода кажется, что вы, возможно, захотите попробовать поменять порядок следующих 2 строк:
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
Насколько я знаю, do_shortcode() применяется к фильтру "the_content" в 11. Вы удаляете его, а затем добавляете обратно. Вместо этого делаем следующее:
$text = apply_filters('the_content', $text);
$text = strip_shortcodes( $text );
Может помочь.
Я немного покопался и попытался воссоздать этот сценарий.
Единственный ответ, который я могу придумать, который может вам помочь, заключается в том, что ваш шорткод JWPlayer добавляется в список шорткодов в фильтре на the_content.
Strip_shortcodes работает только в том случае, если шорткод предварительно добавлен в список шорткодов.. поэтому я подозреваю, что шорткод JWPlayer не добавляется при вызове этого, а добавляется в фильтр.
Есть два способа решить эту проблему проблема.
- добавьте свой собственный шорткод с тем же именем, прежде чем добавлять strip_shortcodes в список, добавив возможность для strip_shortcodes удалить его, однако это удалит ваш JWPlayer из ВСЕХ исключений (может быть или не быть тем, что вы хотите)
- Измените местоположение JWPlayer, в котором он добавляет шорткод, чтобы он был доступен до вызова фильтра_content.
Отредактируйте примечание для #1: После того, как вы выполните коды strip_shortcodes, я бы удалил добавленный вами шорткод, просто если JWPlayer нужно вызвать где-то еще (за пределами отрывка) на той же странице, это может привести к конфликту при добавлении двух шорткодов, в зависимости от порядка загрузки.
Решение для #1:
function nullfunc(){
return '';
}
// put that function outside, it's the placeholder function just so the shortcode registers properly, if the callback isn't a valid function - it won't register.
// do your get_the_content() here
add_shortcode('<replace_with_shortcode_for_JWPlayer','nullfunc');
// do your strip shortcodes here
remove_shortcode('<rplace_with_shortcode_for_JWPlayer');
// continue on with the rest of your code.
Они основаны только на том, что я мог бы воссоздать сам, и я не уверен на 100%, что они помогут вам, хотя я не могу придумать никакой другой причины, по которой strip_shortcodes потерпит неудачу, и это единственный сценарий, который имеет смысл для меня.