web-dev-qa-db-ja.com

Wordpressの抜粋で式設定を有効にする際の問題

これは私が私のテーマのfunctions.phpファイルに追加したもので、Wordpressでの抜粋のフォーマットを有効にします( ヒントのソース ):

remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'bwp_trim_excerpt');

function bwp_trim_excerpt($text)
{
    $raw_excerpt = $text;
    if ( '' == $text ) {
        $text = get_the_content('');
        $text = strip_shortcodes( $text );
        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $text = strip_tags($text, '<em><strong><i><b><a><code>');
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
        if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);
            $text = $text . $excerpt_more;
        } else {
            $text = implode(' ', $words);
        }
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

記事の抜粋でフォーマットを有効にすることの問題は、タグによってフォーマットされたテキスト(<b><strong><i><em>、その他)を間の抜粋によって切り捨てることです。ページ全体のフォーマットはそのタグによって上書きされます。たとえば、このスクリーンショットを見てください。

Screenshot 

抜粋の書式設定がデフォルトで有効になっていないのはそのためです。これを修正する方法はありますか?コードに問題がありますか?

私はここでいくつかの助けを得ることができると思います。ありがとうございます。

4
its_me

このような問題が発生するのを防ぐために、HTMLマークアップが最初から抜粋から削除されている理由の1つは、これですが、意志がある場合は、方法があります...

あなたは、正規表現を使うことによって、抜粋だけに適用可能な開いているタグを閉じることができます、そして、あなたはいくつかのアイデアのために次のリンクを見たいかもしれません

HTMLタグを閉じる

あるいは、WordPress用に作成されたこのプラグインを使用することもできます。

高度な抜粋

あるいは、もしあなたがそれほど傾いていると感じるなら、あなたはそれを修正するか、またはその構造をサンプルしてそれをあなたの関数に適用することができます。

更新

テストを実行することにしましたが、カスタマイズ可能な長さの抜粋をその場で作成するときによく使用する別の関数を使用しました。

これをあなたのfunctions.phpファイルに入れてください、

function content($limit) {
global $content;
  $content = explode(' ', get_the_content(), $limit);
  if (count($content)>=$limit) {
    array_pop($content);
    $content = implode(" ",$content).'...';
  } else {
    $content = implode(" ",$content);
  } 
  $content = preg_replace('/\[.+\]/','', $content);
  $content = apply_filters('the_content', $content); 
  $content = str_replace(']]>', ']]&gt;', $content);
  return $content;
}

に続く、

function closetags($html) {

  #put all opened tags into an array
  $content = $result;
  preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
 $openedtags = $result[1];   #put all closed tags into an array
  preg_match_all('#</([a-z]+)>#iU', $html, $result);
  $closedtags = $result[1];
  $len_opened = count($openedtags);
  # all tags are closed
  if (count($closedtags) == $len_opened) {
    return $html;
  }

  $openedtags = array_reverse($openedtags);
  # close tags
  for ($i=0; $i < $len_opened; $i++) {
    if (!in_array($openedtags[$i], $closedtags)){
      $html .= '</'.$openedtags[$i].'>';
    } else {
      unset($closedtags[array_search($openedtags[$i], $closedtags)]);    }
  }  
    return $html;
} 

あなたのテーマでは、次のようになります。

<?php echo closetags( content(55) );?>  

55 =抜粋したい単語の長さです。

投稿編集画面内の実際の抜粋ボックスを利用したい場合は、このスニペットを関数ファイルに追加することもできます。

function excerpt($limit) {
global $excerpt;
  $excerpt = explode(' ', get_the_excerpt(), $limit);
  if (count($excerpt)>=$limit) {
    array_pop($excerpt);
    $excerpt = implode(" ",$excerpt).'...';
  } else {
    $excerpt = implode(" ",$excerpt);
  } 
  $excerpt = preg_replace('/\[.+\]/','', $excerpt);
  $excerpt = apply_filters('the_excerpt', $excerpt);
  $excerpt = str_replace(']]>', ']]&gt;', $excerpt);
  return $excerpt;
}

そしてその使い方は、

<?php echo closetags( excerpt(55) );?>  

ただし、投稿編集画面で実際の抜粋ボックスを使用する場合は、もちろん手動で<strong>,<em>,<i>,<a>,etc..タグを記述する必要があります。抜粋ボックスのデフォルトのTinyMCEを変更しない限り。

それで、あなたはそれを持っています、あなたはどちらの場合も覆われています、どちらか...

1)the_content()からの抜粋の取得2)the_excerpt()からの抜粋の取得

_ note _ これについては、 Milan によるClose HTML Tagsの例の機能を記述することによってさらに効率的な方法があるかもしれません。

5
userabuser

この関数をテーマのfunctions.phpファイルに追加するのと同じくらい簡単です。コードは明確にコメントされているので、一目瞭然です。

function better_trim_excerpt($text)
{
    $raw_excerpt = $text;
    if ( '' == $text ) {
        $text = get_the_content('');
        $text = strip_shortcodes( $text );
        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]&gt;', $text);

        // Removes any JavaScript in posts (between <script> and </script> tags)
        $text = preg_replace('@<script[^>]*?>.*?</script>@si', '', $text);

        // Enable formatting in excerpts - Add HTML tags that you want to be parsed in excerpts, default is 55
        $text = strip_tags($text, '<strong><b><em><i><a><code><kbd>');

        // Set custom excerpt length - number of words to be shown in excerpts
        $excerpt_length = apply_filters('excerpt_length', 55);

        // Modify excerpt more string at the end from [...] to ...
        $excerpt_more = apply_filters('excerpt_more', ' ' . '...');

        $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
        if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);

            // IMPORTANT! Prevents tags cutoff by excerpt (i.e. unclosed tags) from breaking formatting
            $text = force_balance_tags( $text );

            $text = $text . $excerpt_more;
        } else {
            $text = implode(' ', $words);
        }
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

// Remove the native excerpt function, and replace it with our improved function
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'better_trim_excerpt');

編集: そして、W3 Total CacheでHTMLの縮小が無効になっていることを確認してください(使用している場合)。

[ 原文 - ]

0
its_me