WordPress
カスタマイズ事例

WORDPRESS CUSTOMIZATION

【All in One SEO】バージョン3系から4系になってmetaディスクリプションが短くなってしまった方へ


この100ウェブサイトがそうです。
 
WordPressのSEO用プラグインとして有名な「All in One SEO」ですが、最近バージョン3系から4系にメジャーアップデートされました。
そしてその結果、metaディスクリプションが55文字しか表示されなくなりました・・・。それまでは110文字表示されていたのに。
 
今のところGoogleはあまり意識していないのか、この55文字を無視して、割と長めのディスクリプションを検索結果に表示してくれていますが、そのうち変わってしまわないかとても心配です---という手前の都合ではありますが、調査をおこない、なんとか解決するに至りましたので今回はその事例をご紹介。

All in One SEOでは、特にdescriptionの登録がない場合、当該記事の抜粋をdescriptionとする仕様です。
抜粋は英文で55単語出力となっていますが、これをマルチバイト関連の問題に対処するプラグイン「WP Multibyte Patch」をインストールすることで日本語110文字出力に置き換えてくれます。
この置き換え処理が All in One SEO バージョン4になってうまく反映されなくなり、55文字しか出てこなくなったということだろうと思われます。
つまりこの「WP Multibyte Patch」と「All in one SEO バージョン4」の不整合が原因だろうと推測されますので、そのうちどちらかのプラグインがアップグレードするに伴い解消していくのだと思います。したがって、この不具合は現時点(2020年2月)に限定した不具合かもしれませんのであしからず。
 
さて前置きはこれくらいにして技術的な話に移ります。
All in one SEO バージョン4から、aioseo_postsというプラグイン独自のテーブルが導入され、それまでのフィルター「aioseop_description」でディスクリプションを制御してくれなくなりました。かといって昔登録したディスクリプション記述は完全に無視されるかというとそうでもなく、古い登録はそのまま残って使われるところは使われるようです。
プラグインのメジャーアップデートで下位互換を保つための設計でしょうね、きっと。
いずれにせよ、この大きな仕様変更によって、このフィルターを利用してディスクリプションをカスタマイズしているようなサイトはことごとく改修が必要となります。
 
まあ、そんなわけで頑張って対応しましょう。
テーマの functions.php に以下を記述します。

/* All In ONE SEOの独自テーブルaioseo_postsを$wpdbに対応させる */
function add_db_aioseo() {
  global $wpdb;

  $table_name = $wpdb->prefix. "aioseo_posts";
  if (!isset($wpdb->aioseo_posts))
  {
    $wpdb->aioseo_posts = $table_name;
    $wpdb->tables[] = str_replace($wpdb->prefix, '', $table_name);
  }
}
add_action( 'init', 'add_db_aioseo');

/* Ver3で運用していたがVer4になってしまったサイトに対応 */
function aioseo_description_extention($description){
  global $wpdb,$post;
  $pid = $post->ID;
  $desc0 = $wpdb->get_var($wpdb->prepare("SELECT description FROM $wpdb->aioseo_posts WHERE post_id = %d", $pid));
  $desc1 = get_post_meta($pid, '_aioseo_description', true);
  $desc2 = get_post_meta($pid, '_aioseop_description', true);
  if ($desc0 != '' && $desc0 != '#post_content') {
    $description = $desc0;
  } elseif ($desc1 != '' && $desc0 != '#post_content') {
    $description = $desc1;
  } elseif ($desc2 != '' && $desc0 != '#post_content') {
    $description = $desc2;
  }else{
    $description = get_the_excerpt($pid);
  }
  return $description;
}
add_filter('aioseo_description', 'aioseo_description_extention');

バージョン4以降で登録した内容を優先して取得しつつ、古いバージョンにも対応するための記述と思っていただければ。

なお、この記述では最終的に抜粋を自分で取得してdescriptionに返しています。
したがって、「記事の抜粋を表示する」で紹介しているような、抜粋の文字数をカスタマイズしているようなサイトはその影響を受けますのでご注意ください。

【100ウェブ新着情報メルマガ】

WordPressカスタマイズ事例やウェブ制作ノウハウの新着情報、お役立ち情報を
リアルタイムにメルマガ配信!