Wpにプラグインなしでmeta ogpを設定する

2023年2月12日

いろいろやってみて最終的に現時点ではこれに。
seo.phpとogp.phpに分けてテンプレートheader.phpに読み込むことで実装
ogp.phpにはTwitter Card部分のコードも含まれている。
別記事でも回てますが、indexさせたくないページの記述部分を反映させるためにはfunctions.phpに以下のコードを追加する。

//indexさせないページの設定
if (! function_exists('is_noindex_page')) :
    function is_noindex_page()
    {
        return (is_month()) || // 月のアーカイブページはインデックスに含めない!
        is_category('2') || //カテゴリーarticlsはインデックスに含めない
        is_date() || // 日のアーカイブはインデックスに含めない!
        is_tag() || // タグのアーカイブページをインデックスに含めない!
        is_search() || // 検索結果ページはインデックスに含めない!
        is_404() || // 404ページはインデックスに含めない!
        is_paged() || //分割されたページはインデックスに含めない!
        is_attachment() || //添付ファイルページはインデックスに含めない!
        is_author(); //作成者のアーカイブページはインデックスに含めない!
    }
endif;

ではまずseo.php

<?php if(is_noindex_page()): ?>
<meta name="robots" content="noindex,follow">
<?php endif; ?>

<?php if(is_page('front-page') || is_front_page()): ?>
<title>
	<?php wp_title('|', true, 'right'); ?><?php bloginfo('name'); ?>
</title>
<meta name="description" content="<?php bloginfo('description'); ?>" />

<?php elseif(is_single()): ?>
<?php if(get_field("originalTitle")): ?>
<title><?php echo the_field('originalTitle'); ?>
</title>
<?php else: ?>
<title><?php wp_title(); ?> | Kureai </title>
<?php endif; ?>
<?php if(get_field("originalDescription")): ?>
<meta name="description" content="<?php echo the_field('originalDescription'); ?>" />
<?php $customfield = get_post_meta($post->ID, 'originalDescription', true); ?>
<?php elseif(empty($customfield) && has_excerpt($post->ID)): ?>
<meta name="description" content="<?php echo original_description(); ?>">
<?php else: ?>
<meta name="description" content="<?php if(have_posts()): ?>
		<?php while(have_posts()): the_post(); ?>
		<?php
         $des = get_the_content();
		    $des = strip_tags($des);
		    $des = str_replace('&nbsp;', " ", $des);//改行を除去
		    $des = str_replace(array("\r\n","\r","\n"), '', $des);//余計な文字列を除去
		    $desp = mb_substr($des, 0, 120, "UTF-8");
		    echo $desp;
		    ?>
		<?php endwhile; ?>
	<?php endif; ?>" />
<?php endif; ?>

<?php elseif(is_category()): ?>
<?php if(!is_paged()): ?>
<?php
    $cat_id = get_queried_object()->cat_ID;
    $post_id = 'category_'.$cat_id;
    ?>
<title><?php single_cat_title('', true); ?> |
	<?php bloginfo('name'); ?></title>
<meta name="description" content="<?php
    $cat_id = get_queried_object()->cat_ID;
    $post_id = 'category_'.$cat_id;
    $text = category_description();
    $text = strip_tags($text);
    $text = mb_substr($text, 0, 120, "UTF-8");
    echo $text;
    ?>" />
<?php else: ?>
<title><?php show_page_number(''); ?>ページ目
	<?php single_cat_title('', true); ?> |
	<?php bloginfo('name'); ?></title>
<?php endif; ?>

<?php elseif(is_page()): ?>
<?php if(get_field("originalTitle")): ?>
<title><?php echo the_field('originalTitle'); ?>
</title>
<?php else: ?>
<title>
	<?php wp_title('|', true, 'right'); ?><?php bloginfo('name'); ?>
</title>
<?php endif; ?>
<?php if(get_field("originalDescription")): ?>
<meta name="description" content="<?php echo the_field('originalDescription'); ?>" />
<?php else: ?>
<meta name="description" content="<?php bloginfo('description'); ?>" />
<?php endif; ?>

<?php elseif(is_search()): ?>
<title>検索結果 | <?php bloginfo('name'); ?></title>

<?php elseif(is_404()): ?>
<title>お探しのページはございません |
	<?php bloginfo('name'); ?></title>

<!--(7)その他-->
<?php else: ?>
<title>
	<?php wp_title('|', true, 'right'); ?><?php bloginfo('name'); ?>
</title>
<meta name="description" content="<?php bloginfo('description'); ?>" />
<?php endif; ?>

<?php
if(!is_404() && !is_search()) {
    echo '<link rel="canonical" href="https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'].'">';
}?>

そしてogp.php

<!-- OGP -->
<meta property="og:type" content="<?php echo ( is_single() ? 'article' : 'website' ); ?>">
<?php if ( is_home() || is_front_page() ) : ?>
	<meta property="og:title" content="<?php wp_title( '|', true, 'right' ); ?><?php bloginfo( 'name' ); ?>" />
	<meta property="og:description" content="<?php bloginfo( 'description' ); ?>" />
<?php elseif ( is_single() ) : ?>
	<meta property="og:title" content="<?php the_title(); ?>" />
	<?php if ( has_excerpt( $post->ID ) ) : ?>
	<meta property="og:description" content="<?php echo esc_html( get_the_excerpt() ); ?>" />
	<?php else : ?>
			<?php if ( have_posts() ) : ?>
				<?php
				while ( have_posts() ) :
					the_post();
					?>
					<?php
						$des  = get_the_content();
						$des  = strip_tags( $des );
						$des  = str_replace( ' ', ' ', $des );// 改行を除去!
						$des  = str_replace( array( "\r\n", "\r", "\n" ), '', $des );// 余計な文字列を除去!
						$desp = mb_substr( $des, 0, 120, 'UTF-8' );
					if ( $desp ) {
						echo '<meta property="og:description" content="' . esc_html( $desp ) . '" />';
					} else {
						echo '<meta property="og:description" content="' . esc_html( get_bloginfo( 'description' ) ) . '" />';
					}
					?>
				<?php endwhile; ?>
			<?php endif; ?>
	<?php endif; ?>
<?php elseif ( is_post_type_archive() ) : ?>
	<meta property="og:title" content="<?php wp_title( '|', true, 'right' ); ?><?php bloginfo( 'name' ); ?>" />
	<?php
		$custon_description = get_post_type_object( get_post_type() )->description;
		$custon_description = str_replace( array( "\r\n", "\r", "\n" ), '', $custon_description );
	if ( $custon_description ) {
		echo '<meta property="og:description" content="' . esc_html( $custon_description ) . '" />';
	} else {
		echo '<meta property="og:description" content="' . esc_html( get_bloginfo( 'description' ) ) . '" />';
	};
	?>
<?php elseif ( is_tax() ) : ?>
	<meta property="og:title" content="<?php single_term_title( '', true ); ?> | <?php bloginfo( 'name' ); ?>" />
	<?php
		$custon_description = strip_tags( term_description() );
		$custon_description = str_replace( array( "\r\n", "\r", "\n" ), '', $custon_description );
	if ( $custon_description ) {
		echo '<meta property="og:description" content="' . esc_html( $custon_description ) . '" />';
	} else {
		echo '<meta property="og:description" content="' . esc_html( get_bloginfo( 'description' ) ) . '" />';
	};
	?>
<?php elseif ( is_category() ) : ?>
	<?php if ( ! is_paged() ) : ?>
		<meta property="og:title" content="<?php single_cat_title( '', true ); ?> | <?php bloginfo( 'name' ); ?>" />
		<?php
			$cat_id  = get_queried_object()->cat_ID;
			$post_id = 'category_' . $cat_id;
			$text    = category_description();
			$text    = strip_tags( $text );
			$text    = mb_substr( $text, 0, 120, 'UTF-8' );
		if ( $text ) {
			echo '<meta property="og:description" content="' . esc_html( $text ) . '" />';
		} else {
			echo '<meta property="og:description" content="' . esc_html( get_bloginfo( 'description' ) ) . '" />';
		}
		?>
	<?php else : ?>
		<meta property="og:title" content="<?php show_page_number( '' ); ?>ページ目 <?php single_cat_title( '', true ); ?>" />
	<?php endif; ?>
<?php elseif ( is_page() ) : ?>
	<meta property="og:title" content="<?php the_title(); ?> | <?php bloginfo( 'name' ); ?>" />
		<?php if ( has_excerpt( $post->ID ) ) : ?>
		<meta property="og:description" content="<?php echo esc_html( get_the_excerpt() ); ?>" />
	<?php else : ?>
		<?php if ( have_posts() ) : ?>
			<?php
			while ( have_posts() ) :
				the_post();
				?>
				<?php
					$des  = get_the_content();
					$des  = strip_tags( $des );
					$des  = str_replace( ' ', ' ', $des );// 改行を除去!
					$des  = str_replace( array( "\r\n", "\r", "\n" ), '', $des );// 余計な文字列を除去!
					$desp = mb_substr( $des, 0, 120, 'UTF-8' );
				if ( $desp ) {
					echo '<meta property="og:description" content="' . esc_html( $desp ) . '" />';
				} else {
					echo '<meta property="og:description" content="' . esc_html( get_bloginfo( 'description' ) ) . '" />';
				}
				?>
		<?php endwhile; ?>
	<?php endif; ?>
	<?php endif; ?>
<?php else : ?>
<meta property="og:title" content="<?php bloginfo( 'name' ); ?>" />
<meta property="og:description" content="<?php bloginfo( 'description' ); ?>" />
<?php endif; ?>
<?php
if ( ! is_404() && ! is_search() ) { // 404ページと検索ページでなければ表示!
	echo '<meta property="og:url" content="https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '">';
  echo "\n";
}
?>
<?php
$str            = $post->post_content;
$search_pattern = '/<img.*?src=(["\'])(.+?)\1.*?>/i'; // 投稿にイメージがあるか調べる!
if ( is_single() ) {// 単一記事ページの場合!
	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="' . esc_url( $image[0] ) . '">';
		echo "\n";
		echo '<meta property="og:image:width" content="' . $image[1] . '">';
		echo "\n";
		echo '<meta property="og:image:height" content="' . $image[2] . '">';
		echo "\n";
	} elseif ( preg_match( $search_pattern, $str, $imgurl ) && ! is_archive() ) {// 投稿にサムネイルは無いが画像がある場合の処理
		echo '<meta property="og:image" content="' . esc_url( $imgurl[2] ) . '">';
		echo "\n";
		echo '<meta property="og:image:width" content="1200">';
		echo "\n";
		echo '<meta property="og:image:height" content="630">';
		echo "\n";
	} else { // 投稿にサムネイルも画像も無い場合の処理!
		$ogp_image = get_template_directory_uri() . '/images/og-image.jpg';
		echo '<meta property="og:image" content="' . esc_url( $ogp_image ) . '">';
		echo "\n";
		echo '<meta property="og:image:width" content="1200">';
		echo "\n";
		echo '<meta property="og:image:height" content="630">';
		echo "\n";
	}
} else { // 単一記事ページページ以外の場合(アーカイブページやホームなど)!
	if ( get_header_image() ) {// ヘッダーイメージがある場合は、ヘッダーイメージを!
		echo '<meta property="og:image" content="' . esc_url( get_header_image() ) . '">';
		echo "\n";
		echo '<meta property="og:image:width" content="1200">';
		echo "\n";
		echo '<meta property="og:image:height" content="630">';
		echo "\n";
	} else { // ヘッダーイメージがない場合は、テーマのスクリーンショット!
		echo '<meta property="og:image" content="' . esc_url( get_template_directory_uri() ) . '/screenshot.png">';
		echo "\n";
		echo '<meta property="og:image:width" content="1200">';
		echo "\n";
		echo '<meta property="og:image:height" content="630">';
		echo "\n";
	}
}
?>
<meta property="og:site_name" content="<?php bloginfo( 'name' ); ?>">
<meta property="og:locale" content="ja_JP" />
<meta property="fb:app_id" content="">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:creator" content="twitterのID">
<meta name="twitter:site" content="twitterのID">
PAGE TOP