Не удается удалить шорткод игрока 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', ' ' . '&hellip; <br /><a href="'.get_permalink($post->id).'" class="more-link">'.$more_text.'</a>');
    } else { 
        $excerpt_more = apply_filters('excerpt_more', ' ' . '&hellip;<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;  
} 

Есть идеи?

Author: Jan Fabry, 2011-05-19

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 ...
 2
Author: Jan Fabry, 2011-05-29 19:46:08

На странице кодекса есть функция для 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');

В вашем случае вы бы применили его к своей странице архивов или где угодно еще.

 0
Author: Matthew Muro, 2011-05-26 15:48:46

Попробуйте выполнить приведенный ниже код. Он добавит фильтр для удаления коротких кодов только при вызове вашей функции 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', ' ' . '&hellip; <br /><a href="'.get_permalink($post->id).'" class="more-link">'.$more_text.'</a>');
} else { 
    $excerpt_more = apply_filters('excerpt_more', ' ' . '&hellip;<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;  

} 
 0
Author: Hameedullah Khan, 2011-05-27 05:46:37

Просто собираюсь сделать снимок в темноте здесь, но после просмотра вашего кода кажется, что вы, возможно, захотите попробовать поменять порядок следующих 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 );    

Может помочь.

 0
Author: mfields, 2011-05-27 06:10:28

Я немного покопался и попытался воссоздать этот сценарий.

Единственный ответ, который я могу придумать, который может вам помочь, заключается в том, что ваш шорткод JWPlayer добавляется в список шорткодов в фильтре на the_content.

Strip_shortcodes работает только в том случае, если шорткод предварительно добавлен в список шорткодов.. поэтому я подозреваю, что шорткод JWPlayer не добавляется при вызове этого, а добавляется в фильтр.

Есть два способа решить эту проблему проблема.

  1. добавьте свой собственный шорткод с тем же именем, прежде чем добавлять strip_shortcodes в список, добавив возможность для strip_shortcodes удалить его, однако это удалит ваш JWPlayer из ВСЕХ исключений (может быть или не быть тем, что вы хотите)
  2. Измените местоположение 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 потерпит неудачу, и это единственный сценарий, который имеет смысл для меня.

 0
Author: Mike, 2011-05-30 04:05:00