WordPress には定期的なタスク機能があり、WP Super Cache プラグインはこの定期的なタスクを使用してプリキャッシュを行います。私が使用している間、プリキャッシュは一度に最大で十数ページ生成され、次回の定期的なタスク実行時に続行されますが、非常に遅い効率です。WP Super Cache プリキャッシュページを常に保持しておくと、自動的に生成されますが、効率はまだ遅いです。そこで、WP Super Cache でプリキャッシュできないカテゴリページもキャッシュできる簡単な Python スクリプトを作成しました。
コード:#
まず、サーバーには Python 3 環境が必要で、WordPress には WP Super Cache プラグインがインストールされている必要があります。以下のコードを page.py として編集し、カテゴリのページをキャッシュするために使用します。
import os
import requests
import time
from concurrent.futures import ThreadPoolExecutor
from itertools import islice
# リンクと対応する数を定義
links = {
"https://k7blog.com": 60,
"https://k7blog.com/a8": 10,
}
# リンクを生成
all_links = []
for link, count in links.items():
for i in range(1, count + 1):
page_link = f"{link}/page/{i}" if i > 1 else link
all_links.append(page_link)
# リンクをチャンクに分割して並行アクセスするために使用
def chunk(it, size):
it = iter(it)
return iter(lambda: tuple(islice(it, size)), ())
# リンクを訪問する関数
def visit_url(url):
try:
response = requests.get(url)
print(f"Visited: {url}, Status Code: {response.status_code}")
except Exception as e:
print(f"Failed to visit: {url}, Error: {e}")
# 並行数と遅延を設定
concurrency = 10 # 並行数
delay = 1 # 遅延時間(秒)
# スレッドプールを作成し、リンクを並行して訪問する
with ThreadPoolExecutor(max_workers=concurrency) as executor:
for chunked_links in chunk(all_links, concurrency):
futures = [executor.submit(visit_url, url) for url in chunked_links]
time.sleep(delay)
# リンクをpage.txtファイルに書き込む
with open("page.txt", "w") as f:
for link in all_links:
f.write(link + "\n")
コード中のリンクをカテゴリページに置き換えると、カテゴリに基づいてページをキャッシュすることができます。各行のカテゴリページの後ろの数字は、ページの数です。
例えば、私のカテゴリには 10 ページありますので、15 ページを設定することができます。これにより、記事やページが増えてもキャッシュができなくなることはありません。
次に、以下のコードを url.py に追加します:
import requests
import xml.etree.ElementTree as ET
import threading
import time
# 並行リクエスト数とリクエスト間隔を設定
CONCURRENT_REQUESTS = 10
REQUEST_INTERVAL = 1 # seconds
def fetch_sitemap(url):
"""
サイトマップの内容を取得する
"""
response = requests.get(url)
if response.status_code == 200:
return response.content
else:
print(f"Failed to fetch sitemap from {url}")
return None
def extract_sitemap_urls(sitemap_content):
"""
サイトマップの内容からサブサイトマップのリンクを抽出する
"""
urls = []
if sitemap_content:
try:
root = ET.fromstring(sitemap_content)
for loc in root.findall(".//{http://www.sitemaps.org/schemas/sitemap/0.9}loc"):
urls.append(loc.text)
except ET.ParseError as e:
print("Error parsing sitemap XML:", e)
return urls
def fetch_urls_from_sitemap(url):
"""
サイトマップからウェブページのリンクを抽出する
"""
sitemap_content = fetch_sitemap(url)
if sitemap_content:
return extract_sitemap_urls(sitemap_content)
else:
return []
def fetch_url(url):
"""
ウェブサイトリンクにリクエストを送信する
"""
try:
response = requests.get(url)
# ここで必要なレスポンス内容を処理する
print("Fetched:", url)
except requests.RequestException as e:
print("Error fetching", url, ":", e)
def main():
sitemap_url = "https://k7blog.com/wp-sitemap.xml" # あなたのサイトマップリンクに置き換える
sitemap_urls = fetch_urls_from_sitemap(sitemap_url)
all_urls = []
# すべてのサブサイトマップからウェブページのリンクを抽出する
for url in sitemap_urls:
all_urls.extend(fetch_urls_from_sitemap(url))
# url.txtファイルに書き込む
with open('url.txt', 'w') as f:
for url in all_urls:
f.write(url + '\n')
print("Urls extracted and written to url.txt file.")
# 並行リクエストのスレッド関数
def fetch_urls(urls):
while urls:
url = urls.pop(0)
fetch_url(url)
time.sleep(REQUEST_INTERVAL)
# CONCURRENT_REQUESTS個のスレッドで並行リクエストを送信する
threads = []
for _ in range(CONCURRENT_REQUESTS):
thread = threading.Thread(target=fetch_urls, args=(all_urls,))
thread.start()
threads.append(thread)
# すべてのスレッドの完了を待つ
for thread in threads:
thread.join()
if __name__ == "__main__":
main()
マップのアドレスをあなたのマップのアドレスに置き換えると、ウェブサイトのすべてのリンクが自動的にキャッシュされます。
もし CDN やファイアウォールがある場合、頻繁なプリキャッシュによりブロックされる可能性がありますので、IP をホワイトリストに追加し、ホストファイルを変更してドメインを元の IP または 127.0.0.1 に向けることで、CDN トラフィックを消費しないようにしてください。