求人情報の構造化
Google for jobsに対応した構造化データを実装する
Google for jobsに情報を伝えるために、構造化データをWordPressに適応させようと調べたので、メモ。元々、WordPressにMicrodata方式でテンプレートを作成していたが、リッチリザルトテストでエラーが発生しているのを見過ごしていました。修正をする際に、他の人はどうやっているのだろうといくつかのページをチェックした結果、JSON-LD方式の方が使い勝手が良さそうと判断し、作り変えることに。
元々Microdata方式で構造化データを渡していた
元々カスタム投稿タイプにACFを使って求人票の入力画面を作っていました。あまり難ししないように、パンくずリストと同様にタグに直接埋め込む以下のようなMicroData方式を採用。しかし、google for jobsに掲載されている他の求人を見るとdescriptionの情報が自分のよりも豊富なことに気づいたのです。どうやっているのかなとソースを見ると、JSON-LD方式で情報を渡しているではありませんか。そこで、phpで情報を追加していることに思い至りました。それならJSON-LD方式一択だと書き換えることに。
<div itemscope itemtype="https://schema.org/JobPosting">
<dl>
<?php
$field_work = get_field_object('work_g', $post->ID);
$field_description = get_field_object('description_g', $post->ID);
if($field_work['value'] || $field_description['value']):
?>
<dt>
<span><?php echo nl2br( $field_work['label']); ?></span>
</dt>
<dd>
<span itemprop="description"><?php echo nl2br( $field_work['value'] ); ?></span>
<span><?php echo nl2br( $field_description['value'] ); ?></span>
</dd>
<?php endif ; ?>
</dl>
</div>
JSON-LD方式に変更する
さっそくネットで調べると結構情報があります。その中で下記サイトがやりたいことに近かったため、参考にしました。
上記サイトを参考にテンプレートを書き換えることに。header.phpにJSON-LDを記載し、single-job.phpに記載していたMicroDataを全部削除しました。カスタム投稿タイプの詳細ページにだけJSON-LDを記載したかったので、is_singular(‘post-type’)で分岐します。下記はJSON-LDの一部です。長かったので、割愛しました。そして、descriptionのところだけ、各要素の見出しと中身をとってきて、付け加えながら表示します。場所によって中身が違うのは、元の入力画面のデータの取り方によるものです。
<?php if (is_singular('job')): ?>
<script type="application/ld+json">
{
"@context" : "https://schema.org",
"@type" : "JobPosting",
"title" : "<?php the_field('title_g'); ?>",
"description": "
<?php
$work = get_post_meta($post->ID, 'work_g', true);
$description = get_post_meta($post->ID, 'description_g', true);
if( !empty($work || $description) ): ?>
<?php $field_work = get_field_object('work_g');
$field_description = get_field_object('description_g'); ?>
<p><?php echo strip_tags($field_work['label']);?><br>
<?php echo strip_tags($field_work['value']);?><br>
<?php echo strip_tags($field_description['value']);?>
</p>
<?php endif;?>
<?php
$salaryNormal = get_post_meta($post->ID, 'salary_normal_g', true);
if( !empty($salaryNormal) ): ?>
<?php $field_salary_normal = get_field_object('salary_normal_g');
$field_salary = get_field_object('salary_g'); ?>
<p><?php echo strip_tags($field_salary_normal['label']);?><br>
<?php echo strip_tags($field_salary_normal['value']);?><br>
<?php echo strip_tags($field_salary['value']);?>
</p>
<?php endif;?>
<?php
$workHoursNormal = get_post_meta($post->ID, 'workHours_normal_g', true);
if( !empty($workHoursNormal) ): ?>
<?php $field_workHours_normal = get_field_object('workHours_normal_g');
$field_workHours = get_field_object('workHours_g'); ?>
<p><?php echo strip_tags($field_workHours_normal['label']);?><br>
<?php echo strip_tags($field_workHours_normal['value']);?><br>
<?php echo strip_tags($field_workHours['value']);?>
</p>
<?php endif;?>
<?php
$qualificationNormal = get_post_meta($post->ID, 'qualification_normal_g', true);
if( !empty($qualificationNormal) ): ?>
<?php $field_qualification_normal = get_field_object('qualification_normal_g');
$field_qualification = get_field_object('qualification_g'); ?>
<p><?php echo strip_tags($field_qualification_normal['label']);?><br>
<?php echo strip_tags($field_qualification_normal['value']);?><br>
<?php echo strip_tags($field_qualification['value']);?>
</p>
<?php endif;?>
",
"datePosted" : "<?php the_time('Y-m-d'); ?>"
}
</script>
<?php endif;?>
さて、まだGoogleにインデックスされていないので、確認はできていませんが、ちゃんと表示されるかな。