web-dev-qa-db-ja.com

WordPressの州と市の書き換え規則

私はアメリカのすべての州と都市がランディングページを持つサイトを構築しています。 WPでカスタム投稿タイプとして設定された、すべての市、州、および郵便番号のデータベースがあります。これが、州ごとにランディングページを作成するための成功例です。

function em_rewrite_rules($rules) {
    $newrules = array();
    $newrules['state/(.*)/?'] = 'index.php?state=$matches[1]';
    return $newrules + $rules;
}
add_filter('rewrite_rules_array','em_rewrite_rules');

function em_query_vars($vars) {
    array_Push($vars, 'state');
    return $vars;
}
add_filter('query_vars','em_query_vars');

function em_templates($template) {

    global $wp_query;
    if (isset($wp_query->query_vars['state'])) {
        return dirname(__FILE__) . '/single-state.php';
    }

    return $template;
}

add_filter('template_include', 'em_templates', 1, 1);

これはうまくいっています。すべてのページはsingle-state.phpの内容に基づいて動的に生成されます。

今、私はフォーマットで、都市をサポートする必要があります:

http://example.com/state/new-york/albany/

書き換え規則を作成するさまざまな方法の例が非常にたくさんありますが、それらはすべて私が既に持っているものとは異なるフォーマットに従います。上の実例を得るのに何時間もかかりました。都市が指定されているときに、上記のURL形式を実現し、カスタムテンプレートを読み込むことができる方法を提案することはできますか。

1
Jack Arturo

思ったほど難しくなかった。誰かが役に立つと思う場合のために、これは実用的な例です:

function em_query_vars($vars) {
    array_Push($vars, 'state');
    array_Push($vars, 'city');
    return $vars;
}

add_filter('query_vars','em_query_vars');

function em_rewrite() {

    add_rewrite_rule( '^state/([^/]*)/([^/]*)/?', 'index.php?state=$matches[1]&city=$matches[2]', 'top' );
    add_rewrite_rule( '^state/([^/]*)/?', 'index.php?state=$matches[1]', 'top' );
    add_rewrite_tag('%state%','([^&]+)');
    add_rewrite_tag('%city%','([^&]+)');

}

add_action('init', 'em_rewrite');

function em_templates($template) {

    global $wp_query;
    if (isset($wp_query->query_vars['state']) && isset($wp_query->query_vars['city'])) {
        return dirname(__FILE__) . '/single-city.php';
    } elseif (isset($wp_query->query_vars['state'])) {
        return dirname(__FILE__) . '/single-state.php';
    }

    return $template;
}

add_filter('template_include', 'em_templates', 1, 1);
2
Jack Arturo