GoogleのCustom Search APIでニュースを検索する方法


# 方法 : 検索エンジンの設定でschema.orgタイプにニュース関連のノードを設定する
1. [Programmable Search - 検索エンジンの編集](https://cse.google.com/cse/all)から作った検索エンジンを選択
2. [schema.org タイプを使用しているページを制限する]で「schema.orgタイプ」を選択する
    - 選択できるschema.orgタイプ : [Full Hierarchy - schema.org](https://schema.org/docs/full.html)
    - 今回は、[NewsArticle](https://schema.org/NewsArticle)、[Newspaper](https://schema.org/Newspaper)、[NewsMediaOrganization](https://schema.org/NewsMediaOrganization)を選択してみた
1. 保存は自動でされる

![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/74f85a39-04c2-0356-23c7-10320ac85de3.gif)

# やりたいこと : WordPressのページに検索したニュースを表示したい
WordPressもCustom Search APIも超初心者の状態で進めていた。

1. [WordPressにショートコードを使ってPHPを埋め込む方法 - Qiita](https://qiita.com/ponsuke0531/items/a4328cdd7ddd98579146)を覚えた
1. [WordPressでGoogleのCustom Search APIを使う方法 - ponsuke_tarou’s blog](https://ponsuke-tarou.hatenablog.com/entry/2020/06/29/184108)を覚えた
1. [GoogleのCustom Search APIでORとAND検索する方法 - Qiita](https://qiita.com/ponsuke0531/items/114ea51a34a9b9579916)を覚えた
2. で、普通に検索した時に[ニュース]のところに表示されるみたいなのをWordPressのページに表示してみたかった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/9e1f7931-88ba-ead5-3ec7-e75e20105f43.png)

[API Reference &nbsp;|&nbsp; Custom Search &nbsp;|&nbsp; Google Developers](https://developers.google.com/custom-search/v1)を読んでもよくわからなかった・・・(英語よくわかんないし)

そんな時に「schema.orgタイプ」でできそうと知った。
> You can use schemas from Schema.org to specify if you're only looking for articles/ blog posts.
> To specify the Schema, go to Advanced settings on the Control Panel and select the required schema from here.
> [Google custom search engine for Google News - Stack Overflow](https://stackoverflow.com/questions/13007624/google-custom-search-engine-for-google-news)

「schema.orgタイプ」が何だかはよくわからないけど使ってみる
> schema.org について
> schema.org とは、Google など大手の検索プロバイダにより認められた方法で、コンテンツをマークアップするためにウェブマスターに HTML を提供する取り組みです。たとえば、映画に関するサイトのウェブマスターはサイトの HTML で「Movie」というスキーマタイプと、「director」や「genre」などのプロパティを使用できます。検索プロバイダはそのデータを使用して、検索結果に表示されるページのコンテンツを把握することができます
> [schema.org タイプを使ってトピックの検索エンジンを作成 - Programmable Search Engine ヘルプ](https://support.google.com/programmable-search/answer/4544182?hl=ja)

# やってみた

- 環境
    - Windows 10 Pro 64bit バージョン1909
    - Local by Flywheel 5.6.1
        - PHP 7.4.1 / MySQL 8.0.16 / Apach / WordPress 5.4.2
        - テーマ : [Lightning](https://lightning.nagoya/ja/)

PHPのコードは同じで検索エンジンのschema.org タイプを変えて表示してみた

## schema.org タイプを指定しない場合
Qiitaとかブログの検索結果が出てくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/bc2ed484-555d-f93c-acc9-627b3454c9f7.png)

## schema.org タイプを指定した場合
ニュースだけとはいかないけどニュースっぽい検索結果が出た！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/16bacdb4-b3e2-c5ed-f5e6-f8b31f3db18a.png)

## 使ったコード
コードでは特段「ニュース」とか関係なく、ただ検索しているだけ。

```php:google-search.php
<?php
// 検索ワード群1
$word_group1 = array('ponsuke','tarou','0531','ぽんすけ','たろう');
// 検索ワード群2
$word_group2 = array('Qiita','hatena');
// 検索ワード群1~2はOR条件で検索したい
$word_or1 = implode(' OR ', $word_group1);
$word_or2 = implode(' OR ', $word_group2);
// 検索ワード群1と2のどちらの検索文言も含んで検索したい : (検索ワード群1) AND (検索ワード群2)
$search_words = '(' . $word_or1 . ') AND (' . $word_or2 . ')';
$param_ary = array(
    // 検索ワード
    'q' => $search_words,
    'key' => {APIキー},
    'cx' => {検索エンジンID},
    // JSON形式で取得する
    'alt' => 'json',
    // 取得開始順位(検索結果1~10位を取得するを取得する)
    'start' => 1
);
$param = http_build_query($param_ary);
$reqest_url = 'https://www.googleapis.com/customsearch/v1?' . $param;
$result_json = file_get_contents($reqest_url, true);
$result = json_decode($result_json, true);
$items = $result['items'];
?>

<h1>今日のぽんすけ検索</h1>
<?php if (count($items) === 0) : ?>
<p>ぽんすけ情報はありません。</p>
<?php else : ?>

<?php foreach ($items as $key => $item) : ?>
<a href="<?php echo $item['link']; ?>"><?php echo $item['title']; ?></a>
<br>
<?php endforeach; ?>

<?php endif; ?>
```

```php:functions.php
<?php
// ...省略...
function google_search() {
    // 出力バッファリングを有効化する
    ob_start();
    // 外部ファイルを読み込む
    get_template_part('google-search');
    // 出力バッファを削除する
    return ob_get_clean();
}
add_shortcode('google-search', 'google_search');
```