SNSでリンクをシェアしたときに表示内容を最適化するためにOGPを設定したいときがあります。
そんなときWordPressではプラグインやデフォルトのエディタで指定することもできます。ですが、いちいち個別に設定するのは大変です。
そんなときは、プラグインを使用せずにfunctions.phpにコードを記述することで、現在のtitleタグやdescriptionなどをそのままOGPとして設定することができます。
この方法を使うと、ページ毎に個別に設定する必要がなくなるので設定の手間を省くことができます。ここでは、プラグインを使用せずにfunctions.phpにコードを記述する方法について、そのコードの意味なども含め解説しています。
コード全体像
/*OGPを使用する宣言(htmlタグに属性を追加)*/
function og_tag_prefix($tagdata) {
if(is_home() || is_front_page() || is_singular()){
$tagdata .= ' prefix="og: http://ogp.me/ns#"';
}
return $tagdata;
}
add_filter('language_attributes', 'og_tag_prefix');
/*OGPタグの設定*/
function og_metatags() {
global $post;
if(is_home() || is_front_page() || is_singular()) {
/** 共通項目の設定 **/
$og_type = "article"; //記事ページ 必要に応じてprofileなどに変更
$og_img_common = ""; //画像の絶対パス
$x_site = ""; //X(twitter)のユーザー名 @twitterusername.
$x_card = "summery"; //カードのタイプ 大きい画像で表示したい場合は「summary_large_image」に変更
$fb_id = ""; //FacebookのID。不要な場合は指定なしでOK
/* タイプの設定 */
$og_type = ( is_front_page() || is_home() ) ? 'website' : og_type;
/* URL, タイトルの設定 */
if( is_singular() ) { //投稿(post)、カスタム投稿タイプ、固定ページ、添付ファイルのシングルページの場合
setup_postdata($post);
$og_title = $post->post_title;
$og_url = get_permalink();
$og_desc = mb_substr(get_the_excerpt(), 0, 100);
wp_reset_postdata();
} elseif ( is_front_page() || is_home() ) { //フロントまたは投稿一覧ページの場合
$og_title = get_bloginfo('name');
$og_desc = get_bloginfo('description');
$og_url = home_url();
}
/*画像の設定 アイキャッチがある場合は使用。ない場合は共通項目の$ob_image_commonを使用*/
if ( is_singular() && has_post_thumbnail() ) {
$eyecatch_img = wp_get_attachment_image_src( get_post_thumbnail_id(), 'full');
$og_img = $eyecatch_img[0];
} else {
$og_img = $og_img_common;
}
/* headタグに追加するコードを作成 */
$meta_og .= '<!-- functions.phpのOGP設定 -->';
$meta_og .= '<meta property="og:title" content="'.esc_attr($og_title).'" />' . "\n";
$meta_og .= '<meta property="og:description" content="'.esc_attr($og_desc).'" />' . "\n";
$meta_og .= '<meta property="og:type" content="'.$og_type.'" />' . "\n";
$meta_og .= '<meta property="og:url" content="'.esc_url($og_url).'" />' . "\n";
$meta_og .= '<meta property="og:image" content="'.esc_url($og_img).'" />' . "\n";
$meta_og .= '<meta property="og:site_name" content="'.esc_attr(get_bloginfo('name')).'" />' . "\n";
$meta_og .= '<meta property="og:locale" content="ja_JP" />' . "\n";
if( $x_site != "" ){
$meta_og .= '<meta name="twitter:card" content="'.$x_card.'" />' . "\n";
$meta_og .= '<meta name="twitter:site" content="'.$x_site.'" />' . "\n";
}
if ($fb_id != "") {
$meta_og .= '<meta property="fb:app_id" content="' . $fb_id . '">' . "\n";
}
$meta_og .= '<!-- ここまで -->' . "\n";
echo $meta_og;
}
}
add_action('wp_head','og_metatags');
OGP使用の宣言
OGPを使用するため、まずhtmlタグの中に「prefix=”og: http://ogp.me/ns#”」を追加する処理をします。
/*OGPを使用する宣言(htmlタグに属性を追加)*/
function og_tag_prefix($tagdata) {
if(is_home() || is_front_page() || is_single()){
$tagdata .= ' prefix="og: http://ogp.me/ns#"';
}
return $tagdata;
}
add_filter('language_attributes', 'og_tag_prefix');
is_home() || is_front_page() || is_single()
で、投稿一覧、フロント、投稿(post)、カスタム投稿タイプ、固定ページ、添付ファイルのシングルページに該当する場合のみ「 prefix=”og: http://ogp.me/ns#」を返す関数をog_tag_prefixを作成しています。
add_filter関数のlanguage_attributesフックに作成した関数を追加します。
こうすることで、htmlタグの属性に指定した文字列を追加することができます。HTML上では以下のように表示されます。
OGP用のmetaタグの作成
全体のコード
続いて以下のコードで、OGPの設定をmetaタグとして作成し、headタグの中に表示させています。
/*OGPタグの設定*/
function og_metatags() {
global $post;
if(is_home() || is_front_page() || is_singular()) {
/** 共通項目の設定 **/
$og_type = "article"; //記事ページ 必要に応じてprofileなどに変更
$og_img_common = ""; //画像の絶対パス
$x_site = ""; //X(twitter)のユーザー名 @twitterusername.
$x_card = "summery"; //カードのタイプ 大きい画像で表示したい場合は「summary_large_image」に変更
$fb_id = ""; //FacebookのID。不要な場合は指定なしでOK
/* タイプの設定 */
$og_type = ( is_front_page() || is_home() ) ? 'website' : og_type;
/* URL, タイトル, descriptionの設定 */
if( is_singular() ) { //投稿(post)、カスタム投稿タイプ、固定ページ、添付ファイルのシングルページの場合
setup_postdata($post);
$og_title = $post->post_title;
$og_desc = mb_substr(get_the_excerpt(), 0, 100);
$og_url = get_permalink();
wp_reset_postdata();
} elseif ( is_front_page() || is_home() ) { //フロントまたは投稿一覧ページの場合
$og_title = get_bloginfo('name');
$og_desc = get_bloginfo('description');
$og_url = home_url();
}
/*画像の設定 アイキャッチがある場合は使用。ない場合は共通項目の$ob_image_commonを使用*/
if ( is_singular() && has_post_thumbnail() ) {
$eyecatch_img = wp_get_attachment_image_src( get_post_thumbnail_id(), 'full');
$og_img = $eyecatch_img[0];
} else {
$og_img = $og_img_common;
}
/* headタグに追加するコードを作成 */
$meta_og .= '<!-- functions.phpのOGP設定 -->';
$meta_og .= '<meta property="og:title" content="'.esc_attr($og_title).'" />' . "\n";
$meta_og .= '<meta property="og:description" content="'.esc_attr($og_desc).'" />' . "\n";
$meta_og .= '<meta property="og:type" content="'.$og_type.'" />' . "\n";
$meta_og .= '<meta property="og:url" content="'.esc_url($og_url).'" />' . "\n";
$meta_og .= '<meta property="og:image" content="'.esc_url($og_img).'" />' . "\n";
$meta_og .= '<meta property="og:site_name" content="'.esc_attr(get_bloginfo('name')).'" />' . "\n";
$meta_og .= '<meta property="og:locale" content="ja_JP" />' . "\n";
if( $x_site != "" ){
$meta_og .= '<meta name="twitter:card" content="'.$x_card.'" />' . "\n";
$meta_og .= '<meta name="twitter:site" content="'.$x_site.'" />' . "\n";
}
if ($fb_id != "") {
$meta_og .= '<meta property="fb:app_id" content="' . $fb_id . '">' . "\n";
}
$meta_og .= '<!-- ここまで -->' . "\n";
echo $meta_og;
}
}
add_action('wp_head','og_metatags');
is_home() || is_front_page() || is_single()
で、投稿一覧、フロント、投稿(post)、カスタム投稿タイプ、固定ページ、添付ファイルのシングルページに該当する場合のみ処理を実行しています。
共通項目の設定
ページ毎に固有ではなく、サイト全体で共通となる項目を設定します。
/** 共通項目の設定 **/
$og_type = "article"; //記事ページ 必要に応じてprofileなどに変更
$og_img_common = "https://~"; //画像の絶対パス
$x_site = ""; //X(twitter)のユーザー名 @twitterusername.
$x_card = "summery"; //カードのタイプ 大きい画像で表示したい場合は「summary_large_image」に変更
$fb_id = ""; //FacebookのID。不要な場合は指定なしでOK
x(twitter)やFacebookを特に指定しない場合はx_siteとfb_idは空欄でも問題ありません。
動的に値を取得
/* タイプの設定 */
$og_type = ( is_front_page() || is_home() ) ? 'website' : og_type;
/* URL, タイトル, descriptionの設定 */
if( is_singular() ) { //投稿(post)、カスタム投稿タイプ、固定ページ、添付ファイルのシングルページの場合
setup_postdata($post);
$og_title = $post->post_title;
$og_desc = mb_substr(get_the_excerpt(), 0, 100);
$og_url = get_permalink();
wp_reset_postdata();
} elseif ( is_front_page() || is_home() ) { //フロントまたは投稿一覧ページの場合
$og_title = get_bloginfo('name');
$og_desc = get_bloginfo('description');
$og_url = home_url();
}
/*画像の設定 アイキャッチがある場合は使用。ない場合は共通項目の$ob_image_commonを使用*/
if ( is_singular() && has_post_thumbnail() ) {
$eyecatch_img = wp_get_attachment_image_src( get_post_thumbnail_id(), 'full');
$og_img = $eyecatch_img[0];
} else {
$og_img = $og_img_common;
}
続いて、og_typeやog_title, og_urlなど動的に取得できるデータを設定しています。
/* タイプの設定 */
$og_type = ( is_front_page() || is_home() ) ? 'website' : og_type;
三項演算子を使って、フロントーページか投稿一覧ページの場合は「website」を、それ以外の場合は共通項目で設定したog_typeを指定します(デフォルトはarticle)
/* URL, タイトル, descriptionの設定 */
if( is_singular() ) { //投稿(post)、カスタム投稿タイプ、固定ページ、添付ファイルのシングルページの場合
setup_postdata($post);
$og_title = $post->post_title;
$og_desc = mb_substr(get_the_excerpt(), 0, 100);
$og_url = get_permalink();
wp_reset_postdata();
} elseif ( is_front_page() || is_home() ) { //フロントまたは投稿一覧ページの場合
$og_title = get_bloginfo('name');
$og_desc = get_bloginfo('description');
$og_url = home_url();
}
投稿(post)、カスタム投稿タイプ、固定ページ、添付ファイルのシングルページの場合の場合は、記事タイトルをog_titleに代入します。og_descには本文の100文字目までを適用しています。
フロントまたは投稿一覧ページの場合はget_bloginfo関数を使用してデータを取得しています。
get_bloginfo関数はWordPressの管理画面の「一般」で指定するようなサイト全体で設定してあるデータを取得できる便利な関数です。
headタグに追加するコードを作成
静的および動的に指定したOGPのデータをもとにmetaタグを作成します。
/* headタグに追加するコードを作成 */
$meta_og .= '<!-- functions.phpのOGP設定 -->';
$meta_og .= '<meta property="og:title" content="'.esc_attr($og_title).'" />' . "\n";
$meta_og .= '<meta property="og:description" content="'.esc_attr($og_desc).'" />' . "\n";
$meta_og .= '<meta property="og:type" content="'.$og_type.'" />' . "\n";
$meta_og .= '<meta property="og:url" content="'.esc_url($og_url).'" />' . "\n";
$meta_og .= '<meta property="og:image" content="'.esc_url($og_img).'" />' . "\n";
$meta_og .= '<meta property="og:site_name" content="'.esc_attr(get_bloginfo('name')).'" />' . "\n";
$meta_og .= '<meta property="og:locale" content="ja_JP" />' . "\n";
if( $x_site != "" ){
$meta_og .= '<meta name="twitter:card" content="'.$x_card.'" />' . "\n";
$meta_og .= '<meta name="twitter:site" content="'.$x_site.'" />' . "\n";
}
if ($fb_id != "") {
$meta_og .= '<meta property="fb:app_id" content="' . $fb_id . '">' . "\n";
}
$meta_og .= '<!-- ここまで -->' . "\n";
echo $meta_og;
}
最後にecho $meta_og;
で出力しています。
ただしここまでは作成した関数「og_metatags」であり、まだ実行していません。
headタグ内に出力する
add_action関数を使ってheadタグ内に指定した内容を挿入するwp_headフックを指定し、作成した関数を呼び出します。
add_action('wp_head','og_metatags');
以上です。
ブラウザ上での表示
指定した内容はWEBサイト上できちんと反映されます。