WordPressのアーカイブテンプレートで、私はstrip_shortcodes()
への参照を含むカスタムの抜粋関数を使っています。何らかの理由で、ショートコードがレンダリングされてアーカイブに表示されています。
例: http://arisehub.org/blog/page/2/
"Joshua Cunninghamで新曲を歌う"までスクロールしてください
スクリプトコードが表示されていることに注目してください。これは JW Player へのショートコードのリファレンスです。
これが私がカスタム抜粋関数に使っているコードです。
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;
}
何か案は?
WordPress用のJW Playerプラグイン は、他のすべてのショートコードのようにそのショートコードを登録しないため、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 ...
Codexページに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');
あなたのケースでは、あなたはあなたのアーカイブページまたはあなたが望む他の場所にそれを適用するでしょう。
少し掘り下げて、このシナリオを再作成しようとしました。
私が思いつくことができる唯一の答えはあなたを助けるかもしれませんあなたのJWPlayerのショートコードがthe_contentのフィルタのショートコードのリストに追加されるということです。
strip_shortcodesは、以前にショートコードがショートコードリストに追加されている場合にのみ機能します。したがって、JWPlayerのショートコードはそれを呼び出したときには追加されず、フィルタに追加されます。
この問題を解決するには2つの方法があります。
#1のメモを編集する:strip_shortcodesを実行したら、追加したショートコードを削除します。同じページの別の場所(抜粋の外側)でJWPlayerを呼び出す必要がある場合は、2つのショートコードを追加します。ロード順.
#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が失敗する他の理由を考えることができません。
以下のコードを試してください。 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()は11時の 'the_content'フィルタに適用されます。あなたはそれを削除してからそれを再び追加し直しています。代わりにこれを行う:
$text = apply_filters('the_content', $text);
$text = strip_shortcodes( $text );
助けになるかもしれません。