ようこそのお運びで、厚く御礼申し上げます。
16日目です。今回は記事のフィルターに戻りますが、正規表現で文字列の削除を行います。
最新記事のタイトルリンクを3件表示して、タイトルの一部を削除してみる。
現在表示している記事の末尾に、最新記事のタイトルリンクを3件挿入します。そのタイトルのリンクから特定の文字列を削除します。
用途としては、例えばSEO対策用にページのタイトルを今回みたいに
「最新記事のタイトルのリンクを3件表示して、一部を削除してみる:【16日目】WordPress1日1プラグイン」
としていると、一覧表示したときに「:【16日目】WordPress1日1プラグイン」って邪魔だなっと思ったので削除して一覧作ってみます。
まずは、functions.phpに書いてみます。
では、functions.phpに以下のコードを書きました。
function paka3_StrDelNewPosts($contentData){ $args = array( 'posts_per_page'=>3, 'orderby' =>'post_date', //投稿日 'order' =>'DESC', ); $posts =get_posts( $args ); $list="<b>最新の記事</b><ol class='delStr_ul'>"; foreach($posts as $post){ if(preg_match('/:【.*/',$post->post_title, $regs)){ //更新日のフォーマット変更 $postDate = mysql2date('Y年m月d日', $post->post_date); $post->post_title =str_replace( $regs[0],"", $post->post_title); } $list.="<li class='mylist_li'><a href='".get_permalink($post->ID)."' title='.$post->post_title.'>".$post->post_title."(更新日:".$postDate.")</a></li>"; } $list.="</ol>"; return $list.$contentData; } add_filter('the_content','paka3_StrDelNewPosts');
ポイントはどこ?
- 引数「$contentData」は記事本文です。
- is_single()の条件処理
個別ページ以外のすべての記事ページに表示します。
一覧で表示される不具合を回避 - 最新の記事3件はget_postsで取得します。
- preg_match を$titleから正規表現使って特定の文字列を検索します。
特定の文字列があれば、 $regsに配列で値が入ります。 - str_replaceで置換をします。
$titleから$regs[0](抽出した文字列)を空文字に置換します。if(preg_match('/:【.*/',$title, $regs)){ $title =str_replace( $regs[0],"", $title); }
- add_filter:指定したフィルターフックに、関数をフックします
add_filter('フックするフィルター名','呼び出す関数名') - get_postsで取得した更新日のフォーマット定義は、
$postDate = mysql2date('Y年m月d日', $post->post_modified);
- get_postsで取得してforeachでまわす場合(get_postで取得したデータの場合)
パーマリンクにはちょっと小細工が必要($post->guidでは正しくない)get_permalink($post->id)
コードをプラグイン用のファイルにします
それではfunctions.phpに書いたコードを消して、
「paka3_StrDelNewPosts.php」というファイルを作成し、以下のコードを記入します。
このファイルを[wp-content]>「plugins」ディレクトリに入れ、管理画面で有効にして完了です。
今回のまとめ
今回はタイトルリスト等を作る際の文字処理でした。実は正規表現の部分は「WordPress1日1プラグイン」の固定ページの一部使っています。意外と文字処理って検索エンジンとかを考えないので使い方を考えてしまいますね。