こんばんは!
いつも応援していただき、ありがとうございます。
apa(あぱ)です(^^)
今日は『構造化データの情報送信続編』について書いていきます。
構造化データの情報送信続編
今日はいつもの吹き出し形式ではなくて、たぶん、なんとなく普通に書いていて3000文字位の長さになりそうなので、そのまま思うままに書いていきたいと思います。
ここ最近、中原さんを中心にSEO界隈で「構造化データの送信」の重要性が囁かれています。
中原さんがセミナーや動画内で「構造化データの送信を語っている」のは当然のこと。
この前参加した別のセミナーでもFAQコーナーで、
「構造化データの送信はFAQも送信したほうがいいですか?」
と質問されていました。
やはり中原さんのSEO界隈の影響力はでかいですね。
反面、その意見を翻そうとしている方もいるみたいで、
「いや、そんなことはない。構造化データはそれほど重要じゃない」と言っている方もいるみたいで、二分しているみたいですね。
でもまぁ、僕自身は構造化データの送信が重要なのかどうかはあまりわかっていないものの、とりあえず、「送れるなら送らないより送ったほうがいい」ということで構造化データを送信しています。
そうした構造化データの送信方法についてはすでにこれまでの記事でも書いてきています。
【構造化データの災難】単純な送信はranka math。記事ごとに変えるならPublishPress Authors。対策は検索機能付きClaude
【注意】Schema & Structured Data on this postによる構造化データは0点以下のマイナス!rank math seo推奨
僕みたいな、無知な人間にはこういうの、本当に難しいんですよね。
構造化データの送信の重要性は様々なところで多く語られていますが、具体的な方法、プラグインとかまではほとんど話されていないので本当に厄介です。
つまり、具体的な構造化データの送信方法そのものは自分で調べてやらないとならないので本当に困ります。
正直、今AI時代で本当に助かっています。
AIがなかったら100%自分のサイトで構造化データの送信はできていません。
かといって、AIが100%正しく答えを指し示してくれるか?というとそうでもなく。
結構穴凹なので自分で試しながら最適解を導き出さないとならないのが大変なところ。
ざっくり、これまでの構造化データの送信方法についての僕なりの見解を最初にまとめます。
これまでの復習
これまでの構造化データの送信方法の復習から。
と思いましたけど、いつもそうすると本題が短くなってしまうのでまずは本題を先に書いて、その後文字数が余ったら、過去の復習をやります。
昨日起きた問題と解決策
基本的に、僕は日曜日は「休み」ということにしているのですが、ここ最近は、
「記事数を増やすことに集中する平日」
と、
「平日できないことをやる日曜日」
の二分化しています。
ということで、昨日はこれまでやりたいけれどできなかった問題に対処することにしました。
一番最初に取り組んだのがこの問題。
FAQの構造化データの送信
基本、これまで僕は構造化データの送信は、「author」の情報しか送信していませんでした。
最低限、構造化データの送信としてはそれだけできていれば問題はないかもしれませんが、(後述しますがそれもうまくできていないことが判明した)だけどここ最近、記事をAIで作らせるときに、FAQの構成がよく出来上がるので、せっかくならそれも、構造化データとして送信できたほうが強いなと感じました。
そのため、もう一度構造化データで今度は、FAQを送信する兎方法を探しました。
rank math seoではできない?
基本、僕は構造化データはこれまでの記事でも書いてきたように、rank math seoで送信しています。
一番有名?な構造化データ送信プラグインの、Schema & Structured Data on this postで構造化データを送信すると、なぜだか、含まれていないはずの「動画」の構造化データが送信されて、「あるはずの動画の構造化データがありません!」とサチコでエラーが怒ってしまうのでやめました。
で、rank math seoでauthorの構造化データは送信していたものの、FAQを送ろうとしたら、
「rank math seoでFAQの構造化データを送信するのは有料」でした。
痒いところに手が届かないもどかしさがありますね。
ということで、AIにあれこれ相談してようやくたどり着いた、FAQの構造化データの送信方法は、・・・
function.phpで対応
というもの。
答えだけわかるとすごくシンプルなんですけど、これにたどり着くまでものすごく苦労した。
rank math seoでは、FAQの構造化データを送信できない(やるには有料)
AI(gemini)が他のプラグインを推奨してくるけど、結局できない
最終的にはrank math seoを有料契約するしかないといってくる
ただ他の方法がないか模索したいので、他のAIに質問するプロンプトを作ってもらう
で、他のAIに質問してようやくfunctions.phpで対応できることが判明
コードを作ってもらい、ようやくfaqの送信が完了
という手筈でした。
要するに・・・
記事内のFAQの構造を読み取ってコード内に挿入。
そのコードをfunctions.phpに設置することで、「この構造を持つコンテンツはFAQの構造ですよ」と送信させる方法。
うーん、しかし本当に。ひとつのAIだけに頼るのは危険だなと感じます。
まさか「他に方法があるにも関わらずお手上げ。有料を推奨してくる」とは思いませんでした。
ちなみに、サンプルのコードは記事の最後に掲載します。
とにかくそうして、ようやく、FAQの構造化の送信は完了しました。
しかしそれをやっているときに、つまり、「FAQの構造化が送信できているか?」確認しているときに、もう一つの問題が発覚しました。
あ、つまり、リッチリザルトテストの結果画面を見ているときにもう一つの問題が判明。
監修者情報が送信できていない
記事内で、監修者がいる場合の記事。
これまで、PublishPress Authorsというプラグインを使って、執筆者と監修者とを分けて送信しているつもりだったのですが、さっきのリッチリザルトテストをやってみたら、単純に「著者が2人」になっているだけでした。
つまり監修者情報を構造化データとして送信できていませんでした。
これも困った・・・
やはり有料化を推奨するgemini
で、相変わらずgeminiにその旨を相談したら、「有料プランに入るしかないですね・・・」と回答する始末。
なんでもかんでも、有料プランに入れば解決すると思ったら大間違いです。
決してgeminiを一番信頼しているというわけではないんですけど、一番制限に対する許容が大きいので、制限を気にせず相談できる面では他のAIより優れているんですよね。
ただ結局これについては僕の「設定」が間違っているだけでした。
PublishPress Authorsのカテゴリー設定で、「Schema Property」にreviewedByと入力
すれば解決する問題でした。
つまり、PublishPress Authorsプラグインにおける、設定漏れでした。
PublishPress Authorsの「カテゴリー」というページを開いて、そのカテゴリの中の「reviewer」のquick editをクリックして、その中にある「Schema Property」の項目のボックスに「reviewedBy」と入力して更新するだけ。
これだけで正しく「監修者情報」として送信されていました。
つまりこの「Schema Property」の欄に何も入力されていないと、構造化データは「author」という扱いになってしまうみたいです。
そんな簡単な問題だったとは。
まとめ
結局長くなってしまいましたが、
構造化データの送信はrank math seoが推奨
だけどFAQを送るのは有料
functions.phpでFAQの構造化をマークアップして送信する
PublishPress Authorsの設定がうまくいっていないと監修者情報が送信されない
という感じです。
あくまでも僕なりの設定の話ですが、
(というかたぶん、わかる人がやったらもっと効率的に簡単にやる方法を知っている)
僕みたいな無知な人間が無理やり構造化データを送信する方法としては、
これが限界かと思います。
詳しい人が羨ましい・・・
ちなみにFAQの構造化データの送信で、functions.phpに送信したコードのサンプルはこちらです。
/************************************
* 記事内のQ&AからFAQ構造化データを自動生成する
************************************/
// 下のadd_actionから最後の ‘});’ までをコピーしてfunctions.phpに貼り付けてください。
add_action(‘wp_head’, function () {
// 投稿ページ以外では実行しない
if (!is_single()) {
return;
}
global $post;
$content = $post->post_content;
$faqs = []; // 見つかったQ&Aを格納する配列
/**
* パターン1: <h3>タグのQ&Aを検出
* 例:
* <h3>Q. 質問は何ですか?</h3>
* <p>これが答えです。</p>
*/
$pattern1 = ‘/<h3>(?:Q|Q)\.?\s*([^<]+)<\/h3>\s*<p>(.*?)<\/p>/s’;
preg_match_all($pattern1, $content, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$question = trim($match[1]);
$answer = trim(strip_tags($match[2]));
// 質問と回答が短すぎないかチェック
if (mb_strlen($question) > 5 && mb_strlen($answer) > 10) {
$faqs[] = [‘question’ => $question, ‘answer’ => $answer];
}
}
/**
* パターン2: <strong>タグのQ&Aを検出 (パターン1で見つからなかった場合のみ)
* 例:
* <p><strong>Q1. 質問は何ですか?</strong><br>A1. これが答えです。</p>
*/
if (empty($faqs)) {
$pattern2 = ‘/<strong>(?:Q|Q)\d*\.?\s*([^<]+)<\/strong>.*?<br>\s*(?:A|A)\d*\.?\s*(.*?)<\/p>/s’;
preg_match_all($pattern2, $content, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$question = trim($match[1]);
$answer = trim(strip_tags($match[2]));
// 質問と回答が短すぎないかチェック
if (mb_strlen($question) > 5 && mb_strlen($answer) > 10) {
$faqs[] = [‘question’ => $question, ‘answer’ => $answer];
}
}
}
// Q&Aが1つ以上見つかった場合のみ構造化データを出力
if (!empty($faqs)) {
$schema = [
‘@context’ => ‘https://schema.org’,
‘@type’ => ‘FAQPage’,
‘mainEntity’ => [],
];
foreach ($faqs as $faq) {
$schema[‘mainEntity’][] = [
‘@type’ => ‘Question’,
‘name’ => $faq[‘question’],
‘acceptedAnswer’ => [
‘@type’ => ‘Answer’,
‘text’ => $faq[‘answer’],
],
];
}
// JSON-LD形式でスクリプトを出力
echo ‘<script type=”application/ld+json”>’ . wp_json_encode($schema, JSON_UNESCAPED_UNICODE) . ‘</script>’;
}
});
最後まで読んでいただいてありがとうございます。感想、ご質問等がございましたら、お気軽にコメントをどうぞ(^^)
もしよければ、こちらから応援をお願いします。
よりお役に立てる記事を書けるようがんばれます(^^)
コチラ↓↓をクリックしてapaを応援
コメント