以前はHeadspaceなどを利用してメタ情報などを生成させていましたが、出力場所や内容などをもっと柔軟にいじれるようにしたかったので、このデザインにしてからはHeadspaceを廃止し、基本全て自力で書いています。
その中で少しずついろいろと足りなかった機能を追加してきているのですが、今回は、メタタグのキーワードとかディスクリプションを投稿やカテゴリの情報をもとに生成する方法についてです。
殆どの場合キーワードと投稿タグは同じ?
これは自分のサイトでの場合ですけれども、大抵投稿タグやカテゴリと同じ内容をキーワードとして追加していました。それプラス必要ならサイト名なりAuthorなりを付け加えるというイメージでしょうか?
なので、Keywordsには投稿タグや記事の所属するカテゴリを、Descriptionには、カテゴリの説明文や投稿の抜粋を利用してみることにしました。
仕組みを考える
WordPressでは主に、一欄になるアーカイブページ(あとトップページ)と、記事単体のページの2種類があります。
カテゴリやタグといったアーカイブページの時は、カテゴリ名をキーワードに、カテゴリ設定(或いはタグ設定)にある説明文をディスクリプションにすればよさそうです。
記事単体の場合は、投稿の編集画面にデフォルトでは隠れている「抜粋」というものがあります。(投稿画面右上の表示オプションから選択できます)これをディスクリプションに、キーワードは所属するカテゴリや投稿タグを並べてあげればよさそうですね。
トップページは最新の投稿は出ていますが、ブログの場合ランディングページは一覧より個別ページのほうが多いイメージなので特に目立った設定は行わず、最低限必要なキーワードやデフォルトのディスクリプション( bloginfo(‘description’) )を入れることにしました。
※自分もあまりSEOとか詳しくありませんので、この手法が正しいかどうかはわかりません。ですがとりあえずこのような設定で様子見中です。
コードを書く
実際に現在運用中のコードです。デフォルトキーワードなどは変更してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
<?php $metaDefaultKwd = '@nyagihime,ねぎ,negi'; $metaDefaultDsc = get_bloginfo( 'description' ); if (is_single()) { $myCat = get_the_category(); if (!empty($myCat)) { $myCatNam = array(); foreach($myCat as $c) { array_push($myCatNam,$c->cat_name); } $myCatData = implode(',',$myCatNam).','; } $myTag = get_the_tags(); if(!empty($myTag)) { $myTagNam = array(); foreach($myTag as $t) { array_push($myTagNam,$t->name); } $myTagData = implode(',',$myTagNam).','; } $metaKwrd = $myCatData.$myTagData.$metaDefaultKwd; $post_excerpt = strip_tags(get_the_excerpt()); if (!empty($post_excerpt)) { $metaDesc = $post_excerpt; } else { $metaDesc = $metaDefaultDsc; } } elseif (is_category()) { $myCat = get_queried_object(); if (!empty($myCat)) { $metaKwrd = $myCat->name.','.$metaDefaultKwd; if ($myCat->category_description != '') { $metaDesc = $myCat->category_description; } else { $metaDesc = $metaDefaultDsc; } } else { $metaKwrd = $metaDefaultKwd; $metaDesc = $metaDefaultDsc; } } elseif (is_tag()) { $myTag = get_queried_object(); if(!empty($myTag)) { $metaKwrd = $myTag->name.','.$metaDefaultKwd; if ($myTag->category_description != '') { $metaDesc = $myTag->category_description; } else { $metaDesc = $metaDefaultDsc; } } else { $metaKwrd = $metaDefaultKwd; $metaDesc = $metaDefaultDsc; } } else { $metaKwrd = $metaDefaultKwd; $metaDesc = $metaDefaultDsc; } $metadesc_trim = 50; $metaenc = 'UTF-8'; $metasuffix = '...'; if (mb_strlen($metaDesc,$metaenc) > $metadesc_trim) { $metaDesc = mb_substr($metaDesc,0,$metadesc_trim,$metaenc).$metasuffix; } ?> <meta name="keywords" content="<?php echo $metaKwrd; ?>"> <meta name="description" content="<?php echo $metaDesc; ?>"> |
簡単に説明
だいたい見ればなにしてるのかはわかると思いますが、ざっくりと説明してみますね。
line:2-3デフォルト値の設定
まず、2-3行目でデフォルト値を決めます。何も設定が無くても最低限載せたい内容ですね。自分はキーワードには名前と、TwitterのIDを、ディスクリプションはWordPressの設定にあるキャッチフレーズを設定しました。
line:5-32 投稿ページの時の挙動を決める
投稿ページの場合の設定です。
キーワードを仕込む
まず、get_the_category() 関数で現在のカテゴリ情報を取得します。
それを foreach で回しながら array_push することでカテゴリ名だけの配列を作成します。
最後にそれを implode でカンマ区切りに変換してあげることで、所属カテゴリをカンマ区切りにできました。
因みに、このままだとタグが設定されていない場合はエラーがでますので、タグ情報がない場合はこの処理自体を行わないようにしています(line:7,16)
※カテゴリの場合何も指定しないと自動的に未分類(デフォルトの場合)になるため、ここでエラーになることはないと思いますが、念のため設定してあります。
これをタグでも同じようにやります。
基本的には同じなので殆どコピペでいいと思いますが、カテゴリ名をとる為のメンバ変数がcat_nameなのに対し、タグの名前を取る場合はnameなので注意が必要です。
あとは、カンマ区切りに変換した、カテゴリ、タグ、あと最低限入れておきたかったキーワードたちをつなげて出力用変数にいれてあげればキーワードの準備は終わりです。
ディスクリプションを仕込む
投稿の場合は、投稿の抜粋を利用することにしましたので、まずはそれを取得します。
抜粋の取得には、get_the_excerpt() 関数を使います。
ただ、あとでメタタグに入れた時にこのままだと、抜粋の中にHTMLタグが含まれてた時におかしなことになる ((抜粋中のタグに含まれる「”」のせいでタグが変な所で切れたりする)) ので、予め取得段階で strip_tags() を使ってタグを除去してしまいます(line:25)。
これをキーワードの出力用変数にいれてあげればディスクリプションの準備も完了です。
カテゴリ一覧とタグアーカイブの時の挙動(line:32-65)
カテゴリ一覧の場合は、現在のカテゴリ名と説明文をそれぞれ設定してあげればよさそうですので、 get_queried_object() を使用します。
すると、 $term に取得したカテゴリ(タグ)の名前を取り出すなら $term->name、説明は$term->category_description と書く事ができます。
カテゴリ一覧に入っている以上、カテゴリ名は間違いなく入っているはずなので空の時の対策は省略していますが、本当は念には念を入れてやっておいたほうがいいかもしれません。
やりかたとしては、他でもやってた感じで if (!empty($term)){} みたいな感じでいいかと。
これら以外の時の挙動(line:65-65)
これらのどれにも当てはまらない場合(添付ファイルページやホーム)の場合は、初期値だけをセットするようにしてあります。
ホームは別でなにか設定したい場合は、更にIF文(elseif文)を追加して、is_home()で分岐してあげればホーム用の挙動も決められます。
出力用の準備と、タグの出力(line:67-75)
さて、ここまででほぼ仕込みは終わりました。ですがまだいずれも出力用の変数に値を入れただけですので、実際に出力するわけですが、キーワードはこのままでもOKかもしれませんが、ディスクリプションに関しては抜粋がそのまま出力されると長すぎる場合もありますよね。
一応 get_the_excerpt() 関数は110文字くらいでカットして自動的に「…」を付けてくれるらしいので、metaタグの文字数制限にはかからない筈ですが、もっと少なくしておきたい場合(例えば50文字くらいで切れるようにするとか)は、手動でやってあげる必要があります。
予め、表示する文字数とエンコード、カットしたあとに付ける接尾辞を決めておいてから、
67 68 69 70 71 72 |
$metadesc_trim = 50; $metaenc = 'UTF-8'; $metasuffix = '...'; if (mb_strlen($metaDesc,$metaenc) > $metadesc_trim) { $metaDesc = mb_substr($metaDesc,0,$metadesc_trim,$metaenc).$metasuffix; } |
というふうにしてもとの変数に上書きすることで指定文字数以下に収まるようにしています。文字数を超えていない場合はここを素通りするので全文表示されるわけですね。
mb_strlenは指定した文字列の指定した範囲を取り出せる便利なヤツです。
予め文字数を決めておいて、説明文の長さを mb_strlen で数え、文字数を超えていたらばmb_strlenで0文字目から指定文字目までを取り出し、最後に「…」を付け加えるという処理です。
で、最後にメタタグの中に echo すれば完成です。
おつかれさまでした。
コメントする