WordPressのCategory・Tag・Post情報をAPIで取得し、サイトマップ的なページを作る

ブログの記事情報がまとまったページを作りたい

記事数が増えてくると、過去にどんな記事を書いたか見たくなるのですが、WordPress の管理画面では、何度がクリックしないと、過去記事にたどりつけません。
そこで、APIを使って、過去記事を1ページにまとめてみたいと思います。

カテゴリの取得

カテゴリ取得 API の公式ドキュメントは、 こちら です。
早速コードを書いてみます。取得対象のブログは、このブログ です。

Python

    import requests
    from urllib.parse import urljoin

    def get_categories():
        url_base = 'https://kamiki.blog/'
        url = urljoin(url_base, 'wp-json/wp/v2/categories/')
    
        payload = {
            'page': 1,
            'per_page': 100,
            'order': 'asc',
        }
    
        res = requests.get(url, params=payload)
        data = res.json()
    
        # 必要な情報だけを残す。
        info = {}
        for i, d in enumerate(data):
            inner_data = {}
            inner_data.update({'id': d['id']})
            inner_data.update({'count': d['count']})
            inner_data.update({'link': d['link']})
            inner_data.update({'name': d['name']})
            inner_data.update({'slug': d['slug']})
            info.update({i: inner_data})
        print(json.dumps(info, indent=4, ensure_ascii=False))
        return info

こんな結果が返ってきます。一部抜粋です。

"0": {
"id": 8,
"count": 17,
"link": "https://kamiki.blog/category/python/",
"name": "Python",
"slug": "python"
},

タグの取得

タグ取得 API の公式ドキュメントは、 こちら です。
コードはカテゴリとほぼ同じです。

Python

    def get_tags():
        url_base = 'https://kamiki.blog/'
        url = urljoin(url_base, 'wp-json/wp/v2/tags/')
    
        payload = {
            'page': 1,
            'per_page': 100,
            'order': 'asc',
        }
    
        res = requests.get(url, params=payload)
        data = res.json()
    
        # 必要な情報だけを残す。
        info = {}
        for i, d in enumerate(data):
            inner_data = {}
            inner_data.update({'id': d['id']})
            inner_data.update({'count': d['count']})
            inner_data.update({'link': d['link']})
            inner_data.update({'name': d['name']})
            inner_data.update({'slug': d['slug']})
            info.update({i: inner_data})
        print(json.dumps(info, indent=4, ensure_ascii=False))
        return info

結果の一部です。

"0": {
"id": 23,
"count": 4,
"link": "https://kamiki.blog/tag/csv/",
"name": "csv",
"slug": "csv"
},

投稿記事の取得

投稿記事取得 API の公式ドキュメントは、 こちら です。
コードはちょっとだけ違います。

Python

    def get_posts():
        url_base = config_param.WP_URL_BASE
        url = urljoin(url_base, 'wp-json/wp/v2/posts/')
    
        payload = {
            'page': 1,
            'per_page': 100,
            'status': 'publish',
            'order': 'desc',
        }
    
        res = requests.get(url, params=payload)
        data = res.json()
    
        # 必要な情報だけを残す。
        info = {}
        for i, d in enumerate(data):
            inner_data = {}
            inner_data.update({'id': d['id']})
            inner_data.update({'date': d['date']})
            inner_data.update({'modified': d['modified']})
            inner_data.update({'status': d['status']})
            inner_data.update({'type': d['type']})
            inner_data.update({'link': d['link']})
            inner_data.update({'title': d['title']['rendered']})
            inner_data.update({'categories': d['categories']})
            inner_data.update({'tags': d['tags']})
            info.update({i: inner_data})
        print(json.dumps(info, indent=4, ensure_ascii=False))
        return info

結果の一部で、最初に投稿した記事です。

"32": {
"id": 394,
"date": "2021-05-16T22:02:44",
"modified": "2021-05-23T10:05:10",
"status": "publish",
"type": "post",
"link": "https://kamiki.blog/wordpress-auto-post-in-python/",
"title": "WordPressへ、Pythonではじめての自動投稿",
"categories": [
5
],
"tags": [
16
] }

まとめページの作成

これまでのコードで、カテゴリ・タグ・投稿記事 の情報が揃いました。
後は、まとめページを作るだけです。

Python

    def write_html(category_info, tag_info, post_info):
        filename = 'test.html'
        file_path = os.path.join(os.getcwd(), filename)
        f = open(file_path, 'w')
        f.write('<h2>記事一覧</h2>\n')
        f.write('<ul>\n')
        for key in post_info:
            f.write('<li><a title="{}" href="{}">{}</a></li>\n'
                .format(
                    post_info[key]['title'],
                    post_info[key]['link'],
                    post_info[key]['title'],
                    ))
        f.write('</ul>\n')
        f.close()
        return

test.html を見てください。まとめページができていると思います。
例では、category_info と tag_info は使っていませんが、活用してもいいと思います。
本ブログのまとめページは ここ です。