静的化対象に任意の URL を追加する

Shifter では、テーマの functions.php にフィルターを追加することで、静的化対象の URL に任意の URL を追加できます。WordPress REST API のエンドポイントや、カスタム投稿タイプのページネーション URL など、通常の静的化プロセスで含まれない URL を追加する際に使用します。

使い方

functions.php に以下を追加します。

function my_append_urls( $urls ) {
    $urls[] = home_url('/追加したいパス/');
    return $urls;
}
add_filter( 'ShifterURLS::AppendURLtoAll', 'my_append_urls' );

制限事項

  • URL は WordPress 内に存在する必要があります(外部 URL は取得できません)
  • URL は home_url() で生成する必要があります
  • URL はトレイリングスラッシュで終わるか、以下のサフィックスで終わる必要があります
  • URL は /index.html として生成されます
  • Content-Type は Shifter が WordPress から取得したものと同じになります(例:/wp-json/wp/v2/posts/content-type: application/json として配信)

許可されるファイルサフィックス: .html .xml .rss .rdf .atom .css .js .json

動作確認方法

WordPress 起動中にトップページの URL へ ?urls?urls=1?urls=2 … を付与してアクセスすると、静的化対象の URL 一覧を確認できます。フィルターで追加した URL は "link_type": "from_filter_hook" として表示されます。

curl -s https://your-site.on.getshifter.io/?urls | jq .
{
  "items": [
    {
      "link_type": "from_filter_hook",
      "post_type": "",
      "link": "https://your-site.on.getshifter.io/wp-json/wp/v2/posts/",
      "path": "/wp-json/wp/v2/posts/"
    }
  ]
}

サンプルコード

A. REST API エンドポイントを追加する

function my_append_urls( $urls ) {
    $urls[] = home_url('/wp-json/wp/v2/posts/');
    return $urls;
}
add_filter( 'ShifterURLS::AppendURLtoAll', 'my_append_urls' );

B. 複数の URL をまとめて追加する

function my_append_urls( $urls ) {
    $states = [
        'Alabama',
        'Arizona',
        // ...
        'Wisconsin',
        'Wyoming',
    ];
    foreach ( $states as $slug ) {
        $urls[] = home_url("/states/{$slug}/");
    }
    return $urls;
}
add_filter( 'ShifterURLS::AppendURLtoAll', 'my_append_urls' );

C. カスタム投稿タイプのページネーション URL を追加する

ページネーション URL は自動的に静的化対象に含まれないzため、以下のように動的に生成して追加します。

function my_append_urls( $urls ) {
    $limit = get_option('posts_per_page');
    $args = array(
        'post_type'      => 'product_service',
        'post_status'    => 'publish',
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    );
    $the_query = new WP_Query($args);
    if ($the_query->have_posts()) {
        $last_page = ceil(count($the_query->posts) / $limit);
        for ($i = 2; $i <= $last_page; $i++) {
            $urls[] = home_url('/product_service/page/' . $i . '/');
        }
    }
    return $urls;
}
add_filter( 'ShifterURLS::AppendURLtoAll', 'my_append_urls' );