どんな記事?
テーマとAll in One SEOプラグインでメタタグの出力が競合していたので、テーマのメタタグ出力を抑制することにした記事。子テーマでのアクションフックについても説明。
経緯
CocoonのSEO対策で充分といえば充分なのですが、トップページと投稿ページでTwitter Cardのタイプを変えたりできないので(できないよね?)、AIOSEOを使うことにしました。そこで問題が。
SEO対策のためのメタタグ出力が競合してしまいます。当然といえば当然ですね。Cocoon設定でOFFにできるものはすべてOFFにしたのですが、meta descriptionがどうしても消えてくれませんでした。
ここをOFFにしたんですけどね…
meta descriptionが重複しているとクローラーが正しく表示してくれず、場合によってはページランクが下がったりするなど悪影響ばかりです。
調査
なのでメタタグの出力処理を無効にすることにしました。
cocoon-master\lib\seo.php
に以下の記述がありますのでこれを無効にします。
//メタディスクリプションタグを出力する
add_action( 'wp_head', 'generate_meta_description_tag' );
if ( !function_exists( 'generate_meta_description_tag' ) ):
function generate_meta_description_tag() {
$description = get_meta_description_text();
if ($description && !is_wpforo_plugin_page()) {
echo '<!-- '.THEME_NAME_CAMEL.' meta description -->'.PHP_EOL;
echo '<meta name="description" content="'.esc_attr($description).'">'.PHP_EOL;
}
}
endif;
対策
function.php
// Cocoonが<meta name="description">を出力しないようにする
function remove_metatag_func(){
remove_action('wp_head','generate_meta_description_tag');
}
add_action('after_setup_theme','remove_metatag_func');
こんな感じで書けばOKです。
generate_meta_description_tag
がCocoon親テーマでフックされていた関数です。
ポイント
またここでポイントとなるのは親テーマのアクションフックを子テーマから削除するという点。
基本的には「親テーマ」 → 「子テーマ」の順に読み込まれ親テーマの内容を子テーマで上書きするのですが、functions.php
については親テーマのほうがあとになっています。つまり子テーマでアクションフックをしても親テーマが優先になってしまうのです。
そこで親テーマの読み込みが終了してから実行されるよう、アクションフックにafter_setup_theme
を設定し、remove_action
を登録しています。もし親テーマでadd_filter
さている処理をフックしたいならremove_filter
を使います。アクションとフィルターの違いについては別の機会にまとめようかな。
まとめ
無事にCocoonからのメタタグを抑制することができました。AIOSEOは重いという意見も耳にしますが、使い勝手がいいのも確かです。使い分けつつ、今後またベターな方法があれば切り替えていこうと思います。
コメント