エラー頻発All in One SEOは不要!削除と各設定を公開

Business, プログラミング, マーケティング,

こんにちは、投資家・トレーダー・フリーランスエンジニアの祐です。

All in One SEOを使用しているけど思ったようにGoolgeに表示されない!

アップデートでまた不具合発生!なにをどうすればいいの?

というお悩みを抱えている人は多いのではないでしょうか?僕も以前まで利用していましたが、All in One SEO側のアップデートによるストレスに耐えられなくなり削除しました。加えて、自分の書いたコードと干渉しあってしまうのも問題だったので、削除したことでストレスなく、そして重たいプラグインに依存することもなくなってほんとに良かったです。

というわけで今回はAll in One SEOを利用せずにきちんと内部対策する方法をすべて公開します。

最初にいっておく注意事項として、コードをいじれる人向けになりますので、既成のテーマしか利用したことがない人やノーコードエンジニアの人にはおすすめしません。ガッツリとコードを公開していきます。

この記事は誰におすすめ

  • All in One SEOを使用していてストレスを感じている。
  • 内部対策をAll in One SEOに依存している。
  • サイトが重たくてプラグインを減らしたい。

 この記事の内容 

  • All in One SEO不要でtitleの設定。
  • All in One SEO不要でdescriptionとkeywordの設定。
  • All in One SEO不要でogpの設定。
  • All in One SEO不要でサイトマップを設定。
  • エラー頻発!All in One SEOを削除すべき理由。

All in One SEO不要でtitleの設定。

All in One SEO不要でtitleの設定。
もっとも大事なページタイトルに関しての話からです。

titleタグの設定は、従来の定番は<head>内で

<?php wp_title( '|', true, 'right' ); //ページタイトル ?><?php bloginfo('name'); //サイト名 ?>

というのが定番でしたが、前々から言われている非推奨になるのならないのという問題があるので、上記のコードは使用せずに<?php wp_head(); ?>に自動で出力してもらう方法をとります。

functions.phpに以下を記述してください。

function setup_theme() { // アクションフック
  add_theme_support( 'title-tag' );
}
add_action( 'after_setup_theme', 'setup_theme' );

function rewrite_title($title) {
  if ( is_home() || is_front_page() ) {
    $title['tagline'] = ''; // Topページ
  }
  if (is_single()) {
    $title['site'] = ''; // 投稿ページ
  }
  return $title; // その他の固定ページなど
}
add_filter('document_title_parts', 'rewrite_title');

function rewrite_separator($separator) {
    $separator = '|'; // セパレーターの変更
    return $separator;
  }
add_filter('document_title_separator', 'rewrite_separator');

Topページの部分では、デフォルトだとタイトルのあとに勝手にdescriptionが出力されてしまうため、descriptionの中身を空にしています。

投稿ページの部分では、ページタイトル | サイト名の右側を空にし、投稿タイトルのみにしています。カスタム投稿タイプの人はsingleをsingularに変更するだけです。

セパレーターの変更に関しては、デフォルトだと“-”のため、“|”に変更しています。

設定した後に各ページが自分の思い通りになっているかどうか、デベロッパーツールを使用して確認してみてください。

All in One SEO不要でdescriptionとkeywordの設定。

All in One SEO不要でdescriptionとkeywordの設定。
続いて、タイトルと同じぐらい重要なdescriptionの設定です。

descriptionとkeywordに関しては、

カスタムフィールドを作る → 値を保存 → 出力

という流れです。キーワードは現在SEOとは関係がないといわれていますが、念のためついでで一緒に設定してしまいましょう。functions.phpに記述していきます。まずはカスタムフィールドを作ります。

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;
$description = get_post_meta($post->ID,'description',true);
$keywords = get_post_meta($post->ID,'keywords',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;">ページの説明(最大160文字)※何も入力しない場合、先頭の120文字が自動で使われます。</span>
<textarea id="description" cols="60" name="description" 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;">キーワード( , 区切り)</span>
<input name="keywords" size="60" type="text" value="'.esc_html($keywords).'">
<div style="clear: both;"></div>
</div>';

echo '<div style="margin: 20px 0;">
<span style="float: left; width: 160px; margin-right: 20px;">NOINDEX</span>
<input name="noindex" type="checkbox" value="1">
<div style="clear: both;"></div>
</div>';

echo '<div style="margin: 20px 0;">
<span style="float: left; width: 160px; margin-right: 20px;">NOFOLLOW</span>
<input name="nofollow" type="checkbox" value="1">
<div style="clear: both;"></div>
</div>';
} 

画像のようになればOKです。
画像のようになればOKです。

次に値を保存するためコードです。functions.phpへの記述が続きます。

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['description']))
update_post_meta($post_id, 'description', $_POST['description'] ); //値を保存
else delete_post_meta($post_id, 'description'); //値を削除
if(!empty($_POST['keywords']))
update_post_meta($post_id, 'keywords', $_POST['keywords'] );
else delete_post_meta($post_id, 'keywords');
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);

descriptionに関しての条件分岐をさせておきます。

/カスタムフィールドで設定したディスクリプション
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, 320, "...", "utf-8");//先頭の160文字を取得
}

//先頭の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_single() ) { // 記事ページ
  $get_description = description_switch();
} elseif (is_page()) {
  $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 '';
} elseif ( $noindex && !$nofollow) { // noindexだけチェックしている場合
 echo '';
} elseif ( $nofollow && !$noindex ) { // nofollowだけチェックしている場合
 echo '';
}

//キーワードとディスクリプション設定
if ( is_single() ) { // 記事ページ
 if (!empty($keywords)) echo '';
}
echo '';
}

以上がdescriptionとkeywordの出力です。タイトルと同様、必ず自分のイメージ通りにうまくいくかすべてのぺーじにおいて確認しておきましょう。

ちなみにdescriptionをページ内でテキストとして出力したい場合もあると思います。たとえばこのブログだと、Topやアーカイブページの記事一覧でdescriptionを表示していますし、ページ右上のプロフィールの部分はプロフィールページのdescriptionを出力しています。そのコードも載せておきます。

<?php echo get_post_meta($post->ID, 'description', true); ?>

All in One SEO不要でogpの設定。

All in One SEO不要でogpの設定。
ツイッターカードとFacebook用のOGPの設定です。

今回は<head>内に書き込みます。

<meta property="fb:app_id" content="【App ID】" />
<meta property="fb:admins" content="【FB Admin】" />
<meta name="twitter:card" value="summary"/>
<meta name="twitter:site" value="@【Twitterのユーザー名】" />
<meta name="twitter:creator" value="@【Twitterのユーザー名】" />
<meta name="twitter:title" value="<?php the_title(''); ?>"/>
<meta name="twitter:description" value="<?php echo get_post_meta($post->ID, description, true); ?>"/>

<!-- 個別記事の場合 -->
<?php if (is_single()) { ?>
<meta property="og:url" content="<?php the_permalink() ?>"/>
<meta property="og:title" content="<?php the_title(''); ?>" />
<meta property="og:description" content="<?php echo get_post_meta($post->ID, description, true); ?>" />
<meta property="og:type" content="article" />
<?php
  if(has_post_thumbnail()){ //アイキャッチがある場合
    $image_id = get_post_thumbnail_id();
    $image = wp_get_attachment_image_src($image_id, 'full');
    echo '<meta property="og:image" content="'.$image[0].'" />';echo "n"; //FBのアイキャッチ画像
    echo '<meta name="twitter:image" value="'.$image[0].'" />'; echo "n"; //FBのアイキャッチ画像
  } else { //アイキャッチがない場合
    echo '<meta property="og:image" content="【画像リンク】" />';echo "n"; //指定の画像
    echo '<meta name="twitter:image" value="【画像リンク】" />';echo "n"; //指定の画像
  }
?>

<!-- 個別記事以外の場合 -->
<?php } else { ?>
<meta property="og:site_name" content="<?php bloginfo('name'); ?>" />
<meta property="og:description" content="<?php echo get_post_meta($post->ID, description, true); ?>" />
<meta property="og:type" content="website" />
<meta property="og:image" content="【画像リンク】" />
<meta name="twitter:image" value="【画像リンク】" />
<?php } ?>

基本のOGP画像をセットしておきつつ、投稿ページのアイキャッチ画像がある場合にはそれが表示されます。ツイッターカードの値“summary”は任意で変更してください。

All in One SEO不要でサイトマップを設定。

All in One SEO不要でサイトマップを設定。
最後にサイトマップの作成・送信です。

 結論、Google XML Sitemapsの一択

サイトマップの送信はほとんどの人がAll in One SEOにそのまま任せるかGoogle XML Sitemapsを使用していると思います。

そもそもこの2つのプラグインを同時に利用している人もたくさんいると思いますが、All in One SEOはアップデートの度に「干渉しあっているGoogle XML Sitemapsを無効化してくれ!」と忠告してきて面倒ですよね。

そこはGoogle XML SitemapsではなくAll in One SEOを削除してしまいましょう。Google XML Sitemapsはシンプルでわかりやすいです。プラグインは必要最低限の機能だけあればいいので、サイトマップはGoogle XML Sitemapsに任せておけばじゅうぶんです。

エラー頻発!All in One SEOをおすすめしない理由。

エラー頻発!All in One SEOをおすすめしない理由。
決定的な理由がいくつもあります。

All in One SEOは重量級プラグイン!

All in One SEOは重たいことで有名なプラグインです。削除すると、体感でわかるぐらいサイトの読み込みが早くなります。

干渉し合ってエラー続出。

プログラミングができる人の悩みとして、自分の書いたコードと干渉しあった結果、思わぬ挙動をしてしまうエラーがとても多いです。機能が満載のプラグインならではとも言えます。

プログラミングの初心者やWordpressの初心者向けな反面、しっかりプラグインのことをしっかり理解しておかないと内部対策に影響が出てしまうおそれもあるので、All in One SEOを使うなら注意が必要です。

WordPressの宿命、アップデートがストレス!

WordPressのあるある中のあるあるです。アップデートされるとエラーが起きがちです。Wordpressを使用する時点である程度あきらめなければいけない点ではありますが、ストレスが少ないに越したことはありません。同時にプラグインも少ないほうが理想です。

一度削除して対策してしまえば、アップデートのストレスから解放されるわけです。思い切って削除するのがおすすめです。

タグ: