web-dev-qa-db-fra.com

Impossible de supprimer le shortcode de JW Player?

Sur le modèle d’archive WordPress, j’utilise une fonction d’extrait personnalisée qui inclut une référence à strip_shortcodes(). Pour une raison quelconque, les codes abrégés sont en cours de rendu et affichés dans les archives.

Exemple: http://arisehub.org/blog/page/2/

Faites défiler jusqu'à "Chantez une nouvelle chanson avec Joshua Cunningham"

Remarquez que le code du script s’affiche. C’est une référence de shortcode à JW Player , affichée.

Voici le code que j'utilise pour la fonction d'extrait personnalisé.

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;  
} 

Des idées?

3
Jonathan Wold

JW Player Plugin pour WordPress n'enregistre pas son code court comme tous les autres codes courts, donc strip_shortcodes() ne le saura pas et ne le supprimera pas. Dans le code il y a une note indiquant que c'est parce qu'il utilise des noms d'argument avec un . dedans, et que WordPress ne le supporte pas.

Il y a probablement plusieurs façons de résoudre ce problème, mais je copierais la ligne correspondante de strip_shortcodes() et intégrerais la regex du plugin:

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
Jan Fabry

Il y a une fonction sur la page Codex pour strip_shortcodes qui fait ce dont vous avez besoin:

function remove_shortcode_from_index($content) {
  if ( is_home() ) {
    $content = strip_shortcodes( $content );
  }
  return $content;
}
add_filter('the_content', 'remove_shortcode_from_index');

Dans votre cas, vous l'appliqueriez à votre page d'archives ou à l'endroit souhaité.

0
Matthew Muro

J'ai fait quelques recherches et j'ai essayé de recréer ce scénario.

La seule réponse que je puisse trouver qui puisse vous aider est que votre shortcode JWPlayer est ajouté à la liste des shortcodes dans un filtre sur the_content.

strip_shortcodes ne fonctionne que lorsqu'un shortcode a déjà été ajouté à la liste des shortcode. Aussi, je soupçonne que le shortcode de JWPlayer n'est pas ajouté lorsque vous appelez cela, mais ajouté dans le filtre.

Il y a deux façons de résoudre ce problème.

  1. ajoutez votre propre shortcode avec le même nom avant de faire strip_shortcodes à la liste, en ajoutant la possibilité pour le strip_shortcodes de le supprimer, mais cela supprimera votre JWPlayer de TOUS les exemples (peut être ou ne pas être ce que vous voulez)
  2. Modifiez l'emplacement de JWPlayer à l'endroit où il ajoute le shortcode afin qu'il soit disponible avant l'appel du filtre_content.

Modifier la note pour le n ° 1: Après avoir créé les strip_shortcodes, je supprimerais le shortcode que vous avez ajouté. Si JWPlayer devait être appelé ailleurs (en dehors d'un extrait) sur la même page, il pourrait y avoir un conflit en ajoutant deux shortcodes, selon le cas. sur ordre de chargement.

Solution pour # 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.

Celles-ci sont juste basées sur ce que je pourrais me recréer, et je ne suis pas sûre à 100% de pouvoir vous aider, bien que je ne vois aucune autre raison pour laquelle strip_shortcodes échouerait, et c'est le seul scénario qui me semble logique. .

0
Mike

Essayez le code ci-dessous. Il ajoutera le filtre uniquement pour supprimer les codes abrégés lorsque votre fonction custom_excerpt sera appelée. Le reste de votre site ne sera pas affecté. Je ne suis pas sûr de savoir comment votre fonction get_the_content récupère le contenu. Donc, ce filtre va aussi s'en occuper.

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
Hameedullah Khan

Ici, je vais simplement prendre une photo dans le noir, mais après avoir examiné votre code, il semble que vous souhaitiez peut-être essayer d’échanger l’ordre des 2 lignes suivantes:

$text = strip_shortcodes( $text );    
$text = apply_filters('the_content', $text);

Autant que je sache, do_shortcode () est appliqué au filtre 'the_content' en 11. Vous le supprimez puis vous le rajoutez à nouveau. Faire cela à la place:

$text = apply_filters('the_content', $text);    
$text = strip_shortcodes( $text );    

peut aider.

0
mfields