プラグインcustomizable-post-listings の改良 (1)

投稿日: 2008年8月22日 | カテゴリ:『ワードプレス』>記事整理システム(CPL)

CPLのオリジナルの抜粋(excerpt)設定は、文字列が連続している日本語文ではうまく働きません。日本語記事にも適用できるようにスクリプトを書き直してみました。

1. 本文抜粋スクリプトの日本語対応

次のスクリプトは原文の抜粋設定部分です(1046行目当たり)。

  case '%post_excerpt%':
  case '%post_excerpt_full%':
     $new = apply_filters('the_excerpt', get_the_excerpt());
     if ( '%post_excerpt_full%' != $tag ) $new = str_replace(array('<p>','</p>','<br />'), '', $new);
     break;
  case '%post_excerpt_short%':
     $new = apply_filters('the_excerpt', get_the_excerpt());
     if ($excerpt_words) {
        $words = explode(' ', $new);
        $new = join(' ', array_slice($words, 0, $excerpt_words));
        if (count($words) > $excerpt_words) $new .= "...";
     } elseif ($excerpt_length) {
         if (strlen($new) > $excerpt_length) $new = substr($new,0,$excerpt_length) . "...";
     }
     break;

このスクリプトが日本文ではうまく働かないのは、3行目のコマンドで抜粋内容が取得されていないのが第1の原因であると思われます。また、たとえ取得がうまくいったとしても、日本文では取得した単語数が1あるいは数個と判断されて条件(8~11行目)に適合しないのでうまく機能しないでしょう。

そこで発想を変えて次のような構造でスクリプトを書き直してみました。

    case '%post_excerpt%':
      remove_filter ('the_content',  'wpautop');
      $mycontent = strip_tags($post->post_content);
      $new = mb_substr($mycontent,0,$excerpt_words)." [...]";
     break;
    case '%post_excerpt_full%':
      remove_filter ('the_content',  'wpautop');
      $mycontent = strip_tags($post->post_content);
      $new = mb_substr($mycontent,0,100)." [...]";
     break;

1行目:case %post_excerpt%の開始
2行目:自動改行タグ付加処理の無効化。Wordpressは、エディターで改行した部分に自動的に改行タグを挿入して記事を表示します。したがって、記事やページでrunPHPを有効にしてPHPプログラムを走らせた場合、たとえプログラム内でタグを除去する処理(strip_tags()関数などで)を行ったとしても、プログラムが呼び出す記事の内容は、表示直前に改行部分が改行タグに変更されるので、改行や1行スペースが挿入されて表示されることがあります。この関数は、この自動改行タグ付加処理を無効にするコマンドです。
3行目:記事の内容を取得し、HTMLタグを除去する。
4行目:記事の内容を最初の文字から$excerpt_words(オプションで指定)語まで取得し、[…]を付加して変数$newに保存する。
5行目:case %post_excerpt%の終了
6行目:case %post_excerpt_full%の開始
7行目:自動改行タグ付加処理の無効化。
8行目:記事の内容を取得し、HTMLタグを除去。
9行目:記事の内容を最初の文字から100語まで取得し、[…]を付加して変数$newに保存する。
10行目:case %post_excerpt_full%の終了

「%post_excerpt_short%」の部分はそのまま残してあります。日本語版では、「%post_excerpt%」あるいは「%post_excerpt_full%」の%タグを使用してください。

2. コメント抜粋スクリプトの日本語対応

以下は、原文のコメント抜粋スクリプトです(932行目当たり)。

  case '%last_comment_excerpt%':
  case '%last_comment_excerpt_URL%':
     $new = ltrim(strip_tags(apply_filters('get_comment_excerpt', $comment->comment_content)));
     if ($comment_excerpt_words) {
      $words = explode(' ', $new);
      $new = join(' ', array_slice($words, 0, $comment_excerpt_words));
      if (count($words) > $comment_excerpt_words) $new .= "...";
     } elseif ($comment_excerpt_length) {
      if (strlen($new) > $comment_excerpt_length) $new = substr($new,0,$comment_excerpt_length) . "...";
     }
     if ( '%last_comment_excerpt_URL%' == $tag )
      $new = '<a href="'.get_permalink().'#comment-'.$comment->comment_ID.'">'.$new.'</a>';
     break;

本文の抜粋文に適用したコンセプトで次のように書き直しました。

    case '%last_comment_excerpt%':
     remove_filter ('the_content',  'wpautop');
     $mycomment = strip_tags($comment->comment_content);
     $new = mb_substr($mycomment,0,$comment_excerpt_words)." [...]";
     break;

1行目:case %last_comment_excerpt%の開始
2行目:改行タグ自動挿入処理の無効化。
3行目:コメントの内容を取得し、HTMLタグを除去する。
4行目:コメントの内容を最初の文字から $comment_excerpt_words(オプションで指定)語まで取得し、[…]を付加して変数$newに保存する。
5行目:case %last_comment_excerpt%の終了

「%last_comment_excerpt_URL%」はそのままに残しておきました。これは、抜粋文全体がコメント欄にリンクされるという設定です。このリンクは、「%comments_URL%」で代用できるのでこの%タグはあまり使う必要はないと思います。

3.要約表示スクリプトの日本語対応

以下は、原文の要約(moreまでの文章の表示)表示スクリプトです(1038行目当たり)。

 case '%post_content_upto_more%' :
  $content = apply_filters('the_content', $post->post_content);
  $content = explode('<!--more-->', $content, 2);
  $new = $content[0];
 break;

処理に時間がかかるのと自動改行タグ付加処理による表示の不安定性を改善しました。

 case '%post_content_upto_more%' :
  remove_filter ('the_content',  'wpautop');
  $content = "$post->post_content";
  $content = explode('<!--more-->', $content, 2);
  $new = $content[0];
 break;

1行目:case %post_content_upto_more%の開始
2行目:自動改行タグ付加処理の無効化。
3行目:コメントの内容を変数に取得する。原文のapply_filters()関数は、処理に時間がかかるようです。したがって、記事の内容を単純に変数に代入するようにしました。
4行目:more部分で文章を2つに分割し、配列として保存する。
5行目:第1配列要素を変数$newに保存する。
6行目:case %post_content_upto_more%の終了

以上、使用例については、「プラグインcustomizable-post-listingsの使用法」を参照してください。

問題点

  • 抜粋表示は、文が途中で切れたり、表の内容や図の説明が改行なしに続いて表示されてしまうことがあります。これはこの%タグの限界(利点?)で仕方がないことです。サイドバーのようにスペースが限られる場所では、この%タグは威力を発揮しますが、ポストやページで使用する場合には、本文の要約表示は、「%post_content_upto_more%」タグのほうが安定、確実性の点で優れています。

関連記事



コメントを残す




空欄に計算式を満たす数値を記入してください(必須)