web-dev-qa-db-fra.com

WordPress réécrit les règles pour l'état et la ville

Je construis un site où chaque État et chaque ville des États-Unis a une page de destination. J'ai une base de données de chaque ville, état et code postal, configuré comme type de message personnalisé dans WP. Voici ce que j'ai fait avec succès pour créer une page de destination pour chaque état:

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);

Cela fonctionne très bien. Chaque page est générée dynamiquement en fonction du contenu de single-state.php.

Maintenant, j'ai besoin de soutenir les villes, dans le format:

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

J'ai trouvé de nombreux exemples de différentes manières de créer des règles de réécriture, mais toutes suivent un format différent de celui que j'ai déjà. Il m'a fallu de nombreuses heures pour obtenir l'exemple de travail ci-dessus. Quelqu'un peut-il proposer un moyen d'obtenir le format d'URL ci-dessus et de charger un modèle personnalisé lorsqu'une ville est spécifiée?

1
Jack Arturo

Ce n'était pas aussi dur que je pensais. Voici l'exemple de travail, au cas où quelqu'un le jugerait utile:

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