Yoast SEO を停止して、Rank Math SEO プラグインを使ってみたらGoogle の検索結果に表示される記事抜粋スニペットの文字数が短過ぎに見えてびっくりした。
どうやら、このRank Math SEO では投稿記事の抜粋欄を何もテンプレート設定しておかないと、meta description に日本語では句読点「。」までの1文章しか記述されないようだ。長い文章であれば300字でも500字でも表示されることがわかった。
Rank Math の設定で、
SEO Titles & Meta >> Posts
“Single Post Description” に “%excerpt%” と記入しておくと、155文字ぐらいきっちり表示される様になる。
Googleの検索結果に og:description 表示
Googleの検索結果では、
<meta name="description" content="*****">
の内容が表示される。
このmeta description がない場合は、
<meta property="og:description" content="***">
の内容が表示される。
Yoast SEO プラグインで、投稿の「メタディスクリプション」を設定していない場合は、meta name="description" は記述されないが、meta property="og:description" は、 get_the_excerpt() で自動的に取得されてhead内に記述される。
Google の検索結果を見てみると、3~4行に収まる範囲で150文字~250文字ぐらい表示されている。
少し多めに書いておいたほうがいいのではないか。
get_the_excerpt の文字数設定、  除去
それで、Yoast が get_the_excerpt() で自動的に記述する文字数を350文字にするには、functions.php に次を記述。
function custom_excerpt_length( $length ) { return 350; } add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );
get_the_excerpt で得られる文章内の、不要な文字列を除去して整形しておく。特に、  とか URL を除去したい。
//URLの正規表現 define('URL_REG_STR', '(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)'); define('URL_REG', '/'.URL_REG_STR.'/'); //抜粋関連 nbsp 除去 function my_excerpt($content){ $trimMatch = array(" " , " " , "&nbs" , "&nb" , "&n"); $content = preg_replace('/<!--more-->.+/is', '', $content); //moreタグ以降削除 $content = strip_tags($content);//タグの除去 $content = strip_shortcodes($content);//ショートコード削除 $content = str_replace(' ', '', $content);//特殊文字の削除(今回はスペースのみ) $content = preg_replace('/\[.+?\]/i', '', $content); //ショートコードを取り除く $content = preg_replace(URL_REG, '', $content); //URLを取り除く $content = preg_replace('/ /u', '', $content); //空白を取り除く return str_replace($trimMatch , "" , $content); } add_filter('get_the_excerpt', 'my_excerpt');
以上で、 <meta property="og:description" content="***">
に300文字ぐらい表示される。
この内容が検索結果に表示されるとは限らないが、一応多めに記述しておく。
ついでに、functions.php に書いてある、抜粋 excerpt 取得関連の function を記載しておく。
//本文部分の冒頭を綺麗に抜粋する echo get_content_excerpt( get_the_content(), 150 ) function get_content_excerpt($content, $length = 150){ //_v($content); $content = preg_replace('/<!--more-->.+/is', '', $content); //moreタグ以降削除 $content = strip_tags($content);//タグの除去 $content = strip_shortcodes($content);//ショートコード削除 $content = str_replace(' ', '', $content);//特殊文字の削除(今回はスペースのみ) $content = preg_replace('/\[.+?\]/i', '', $content); //ショートコードを取り除く $content = preg_replace(URL_REG, '', $content); //URLを取り除く //$lengthが整数じゃなかった場合の処理 if (is_int(intval($length))) { $length = intval($length); } else { $length = 150; } $over = intval(mb_strlen($content)) > $length; $content = mb_substr($content, 0, $length);//文字列を指定した長さで切り取る $content = esc_html($content); $content = $content . ' ...'; return $content; } //本文部分の冒頭を綺麗に抜粋する $excerptから echo get_kirei_excerpt( get_the_excerpt(), 150 ) function get_kirei_excerpt($excerpt, $length = 150){ //_v($excerpt); $excerpt = preg_replace('/<!--more-->.+/is', '', $excerpt); //moreタグ以降削除 $excerpt = strip_tags($excerpt);//タグの除去 $excerpt = strip_shortcodes($excerpt);//ショートコード削除 $excerpt = str_replace(' ', '', $excerpt);//特殊文字の削除(今回はスペースのみ) $excerpt = preg_replace('/\[.+?\]/i', '', $excerpt); //ショートコードを取り除く $excerpt = preg_replace(URL_REG, '', $excerpt); //URLを取り除く //$lengthが整数じゃなかった場合の処理 if (is_int(intval($length))) { $length = intval($length); } else { $length = 150; } $over = intval(mb_strlen($excerpt)) > $length; $excerpt = mb_substr($excerpt, 0, $length);//文字列を指定した長さで切り取る $excerpt = esc_html($excerpt); $excerpt = $excerpt . ' ...'; return $excerpt; } // wpp ID から抜粋取得 get_the_excerpt_by_id(150, 80); id=150 function get_the_excerpt_by_id($post_id='', $length=150){ global $post; $post_bu = ''; if(!$post_id){ $post_id = get_the_ID(); } else { $post_bu = $post; $post = get_post($post_id); } $mojionly = strip_tags($post->post_content); $mojionly = strip_tags(strip_shortcodes($mojionly)); //Strips tags and images $mojionly = str_replace(' ', '', $mojionly);//特殊文字の削除 $mojionly = preg_replace(URL_REG, '', $mojionly); //URLを取り除く if(mb_strlen($mojionly ) > $length) $t = '...'; $content = mb_substr($mojionly, 0, $length); $t = '...'; $content .= $t; if($post_bu) $post = $post_bu; return $content; }