当サイトのリンクにはアフィリエイト広告が含まれています

WordPressプラグインなしで記事毎にSEO対策をする方法。

先日、自作のWordPressテーマ「4536」を改良した時、プラグインを使わずにテーマ内でSEO対策ができる仕様にしました。

関連SEO関連の設定がテーマ内でできるようになりました。

  • OGP設定
  • カノニカル設定
  • ページネーション最適化
  • 記事毎のSEO対策

など、SEOプラグインの主要機能をほぼほぼ実装したような形です。

その中でも特に頑張った実装したのが「記事毎にSEO対策をする」機能。

  • メタキーワード
  • メタディスクリプション
  • noindex
  • nofollow

の設定項目を追加したかったんですが、ぴったりの情報をネットで見つけることができず、なかなか苦労しました。。

ただ、苦労するのは僕で最後です。今回は僕が頑張って完成させたコードを公開しちゃいます。

2017/10/4クイック編集で公開・更新すると値が削除される不具合の修正

2018/1/22予約投稿で値が削除される不具合の修正

【追記】OGP対応の使い勝手が良いコードを新しく書きました!こちらの記事で公開しています。


参考になったサイト

と、その前に。コードを書く上で、こちらの記事が大変参考になりました。

functions.phpにコピペ!

では、コードをご紹介します。下記のコードをfunctions.phpにコピペするだけでOKです。(関数化しているので、複数ページで使用することができます)

////////////////////////////////////
// 記事ページにカスタムフィールド追加
////////////////////////////////////
add_action('admin_menu', 'add_custom_fields');
function add_custom_fields() {
add_meta_box( 'seo_setting', 'SEO対策', 'seo_custom_fields', 'post', 'normal', 'high');
add_meta_box( 'seo_setting', 'SEO対策', 'seo_custom_fields', 'page', 'normal', 'high');
}

function seo_custom_fields() {
global $post;
$keywords = get_post_meta($post->ID,'keywords',true);
$description = get_post_meta($post->ID,'description',true);
$noindex = get_post_meta($post->ID,'noindex',true);
 if( $noindex == 1 ) {
 $noindex_check = "checked";
 } else {
 $noindex_check = "/";
 }
$nofollow = get_post_meta($post->ID,'nofollow',true);
 if( $nofollow == 1 ) {
 $nofollow_check = "checked";
 } else {
 $nofollow_check = "/";
 }

echo '<div style="margin:20px 0;">
 <span style="float:left;width:160px;margin-right:20px;">キーワード(コンマ区切り)</span>
 <input type="text" name="keywords" value="'.esc_html($keywords).'" size="60" />
 <div style="clear:both;"></div>
 </div>';

echo '<div style="margin:20px 0;">
 <span style="float:left;width:160px;margin-right:20px;">ページの説明(最大120文字ほど)※何も入力しない場合、先頭の120文字が自動で使われます。</span>
 <textarea name="description" id="description" cols="60" rows="4" />'.esc_html($description).'</textarea>
 <div style="clear:both;"></div>
 </div>';

echo '<div style="margin:20px 0;">
 <span style="float:left;width:160px;margin-right:20px;">NOINDEX(検索結果への表示をブロックします)</span>
 <input type="checkbox" name="noindex" value="1" ' . $noindex_check . '>
 <div style="clear:both;"></div>
 </div>';

echo '<div style="margin:20px 0;">
 <span style="float:left;width:160px;margin-right:20px;">NOFOLLOW(リンクを除外します)ほとんどの場合、チェックを入れる必要はありません。</span>
 <input type="checkbox" name="nofollow" value="1" ' . $nofollow_check . '>
 <div style="clear:both;"></div>
 </div>';
}

////////////////////////////////////
// カスタムフィールドの値を保存
////////////////////////////////////
function save_custom_fields( $post_id ) {
if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id;
if(isset($_POST['action']) && $_POST['action'] == 'inline-save') return $post_id;
if(!empty($_POST['keywords']))
update_post_meta($post_id, 'keywords', $_POST['keywords'] );
else delete_post_meta($post_id, 'keywords');
if(!empty($_POST['description']))
update_post_meta($post_id, 'description', $_POST['description'] );
else delete_post_meta($post_id, 'description');
if(!empty($_POST['noindex']))
update_post_meta($post_id, 'noindex', $_POST['noindex'] );
else delete_post_meta($post_id, 'noindex');
if(!empty($_POST['nofollow']))
update_post_meta($post_id, 'nofollow', $_POST['nofollow'] );
else delete_post_meta($post_id, 'nofollow');
}
function transition_post_status_4536($new_status, $old_status, $post) {
 if (($old_status == 'auto-draft'
 || $old_status == 'draft'
 || $old_status == 'pending'
 || $old_status == 'future')
 && $new_status == 'publish') {
 return $post;
 } else {
 add_action('save_post', 'save_custom_fields');
 }
}
add_action('transition_post_status', 'transition_post_status_4536', 10, 3);

////////////////////////////////////
// ディスクリプション
////////////////////////////////////

//カスタムフィールドで設定したディスクリプション
function custom_description() {
 $description = get_post_meta(get_the_ID(), 'description', true);
 $description = strip_tags(str_replace(array("\r\n", "\r", "\n"), '', $description));//改行削除
 return mb_strimwidth($description, 0, 240, "...", "utf-8");//多すぎても意味がないので先頭の120文字を取得
}

//先頭の120文字をディスクリプションとして自動で取得
function auto_description() {
 $post_content = get_post(get_the_ID())->post_content;
 $post_content = esc_html(strip_tags(str_replace(array("\r\n", "\r", "\n"), '', $post_content)));
 return mb_strimwidth($post_content, 0, 240, "...", "utf-8");
}

//条件によって読み込むディスクリプションを変更
function description_switch() {
 if ( custom_description() ) {
 $description = custom_description();
 } else {
 $description = auto_description();
 }
 return $description;
}

//ディスクリプション設定
function description() {
if ( is_singular() ) { // 記事ページ
 $get_description = description_switch();
} elseif (is_category()) { // カテゴリーページ
 if (term_description()) { //カテゴリーの説明を入力している場合
 $get_description = term_description();
 } else { //カテゴリーの説明がない場合
 $get_description = single_cat_title('', false)."の記事一覧";
 }
} elseif (is_tag()) { // タグページ
 if (term_description()) { //タグの説明を入力している場合
 $get_description = term_description();
 } else { //タグの説明がない場合
 $get_description = single_tag_title('', false)."の記事一覧";
 }
} else { // その他ページ
 $get_description = get_bloginfo('description');
}
 return $get_description;
}

////////////////////////////////////
// 設定の反映
////////////////////////////////////
function custom_seo_meta() {
// カスタムフィールドの設定値の読み込み
$custom = get_post_custom();
if(!empty( $custom['keywords'][0])) {
 $keywords = $custom['keywords'][0];
}
if(!empty( $custom['noindex'][0])) {
 $noindex = $custom['noindex'][0];
}
if(!empty( $custom['nofollow'][0])) {
 $nofollow = $custom['nofollow'][0];
}

//noindexとnofollow設定
if ( $noindex && $nofollow ) { // 両方チェックしている場合
 echo '<meta name="robots" content="noindex,nofollow">';
} elseif ( $noindex && !$nofollow) { // noindexだけチェックしている場合
 echo '<meta name="robots" content="noindex,follow">';
} elseif ( $nofollow && !$noindex ) { // nofollowだけチェックしている場合
 echo '<meta name="robots" content="nofollow">';
}

//キーワードとディスクリプション設定
if ( is_singular() ) { // 記事ページ
 if (!empty($keywords)) echo '<meta name="keywords" content="'.$keywords.'">';
}
echo '<meta name="description" content="'.description().'">';

}

コピペ後は「カスタムフィールド」として設定項目が追加される

コードをコピペすると、投稿の編集画面に下記の設定項目が追加されます。

 

よく、

  1. 画面上の「カスタムフィールド」にチェックを入れる
  2. カスタムフィールドに〇〇という名前を入力する

みたなコードを紹介している記事もありますが、今回の方法だと、その作業がそもそも必要ありません。コードをコピペするだけですぐに使えます。

ファイルを読み込む

先ほどのコードで、設定値の読み込みを関数化しているので、後は読み込むファイル側に下記のコードを追加するだけでOKです。

<?php custom_seo_meta();?>

※今回はメタ情報なので、header.phpの中にある<head></head>の中に追加すればいいでしょう。

カスタムフィールドの入力欄に何も入力しない場合

ちなみに、何も入力しない場合、

  • メタキーワードのコードを出力しない
  • 記事の先頭120文字をディスクリプションとして設定
  • noindex、nofollowともにコードを出力しない

となります。キーワードやディスクリプションが入力されてないのに、

<meta name="keywords" content="">
<meta name="description" content="">

と、出力しても意味がありませんからね。オリジナルテーマにこの機能を実装するなら、必須の条件分岐でしょう。

まとめ

自分で言うのもなんですが、かなり使い勝手が良いコードになったと思います。

コピペするだけなので、脱プラグインをしたい方はぜひ使ってみてはいかがでしょうか?


カテゴリー:カスタマイズ

シェフ

このサイト「Fantastech」を運営している人