You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress层级分类目录与自定义文章类型Permalink配置需求

How to Build a WordPress Directory Site with Hierarchical Taxonomies & Custom URL Structures

Got it, let's break down how to build this hierarchical WordPress directory site step by step—this is a pretty common setup, so we can tackle it with core WordPress functions and some custom code:

First, head to Settings → Permalinks in your WordPress dashboard. Set the permalink structure to /%post_name%/—this will automatically give your regular Pages clean URLs like site.com/about, which matches your requirement.

2. Register Hierarchical Taxonomies (State & City)

We need two linked hierarchical taxonomies: state (parent level) and city (child of state). Add this code to your theme's functions.php file or a custom plugin:

// Register State taxonomy
function register_state_taxonomy() {
    $args = array(
        'labels' => array(
            'name' => 'States',
            'singular_name' => 'State'
        ),
        'hierarchical' => true, // Enable parent/child structure
        'show_ui' => true,
        'show_admin_column' => true,
        'query_var' => true,
        'rewrite' => array(
            'slug' => '', // Let it act as a top-level URL segment
            'with_front' => false
        )
    );
    register_taxonomy('state', 'office', $args);
}

// Register City taxonomy (linked to State)
function register_city_taxonomy() {
    $args = array(
        'labels' => array(
            'name' => 'Cities',
            'singular_name' => 'City'
        ),
        'hierarchical' => true,
        'show_ui' => true,
        'show_admin_column' => true,
        'query_var' => true,
        'rewrite' => array(
            'slug' => '%state%', // Inherit parent State's slug for URL structure
            'with_front' => false
        )
    );
    register_taxonomy('city', 'office', $args);
}
add_action('init', 'register_state_taxonomy');
add_action('init', 'register_city_taxonomy');

The %state% placeholder in the City taxonomy's rewrite rule ensures its URL will nest under the parent State's slug, creating the state/city hierarchy.

3. Register the "Office" Custom Post Type (CPT)

Next, register the office CPT with a rewrite structure that includes State, City, office name, and address. We'll assume:

  • The CPT's title is your office name
  • The CPT's slug (post_name) is your office address (you can set this manually when editing offices, or auto-generate it via code if needed)

Add this code to the same file as above:

// Register Office CPT
function register_office_cpt() {
    $args = array(
        'labels' => array(
            'name' => 'Offices',
            'singular_name' => 'Office'
        ),
        'public' => true,
        'has_archive' => false, // We'll handle archives manually
        'hierarchical' => false,
        'rewrite' => array(
            'slug' => '%state%/%city%/%post_title%', // Base structure with placeholders
            'with_front' => false
        ),
        'supports' => array('title', 'editor', 'custom-fields')
    );
    register_post_type('office', $args);
}
add_action('init', 'register_office_cpt');

// Replace placeholders in Office permalinks
function replace_office_permalinks($post_link, $post) {
    if ($post->post_type !== 'office') return $post_link;

    // Swap %state% with the linked state's slug
    $state_terms = wp_get_post_terms($post->ID, 'state');
    if (!empty($state_terms)) {
        $post_link = str_replace('%state%', $state_terms[0]->slug, $post_link);
    }

    // Swap %city% with the linked city's slug
    $city_terms = wp_get_post_terms($post->ID, 'city');
    if (!empty($city_terms)) {
        $post_link = str_replace('%city%', $city_terms[0]->slug, $post_link);
    }

    // Swap %post_title% with the office name's slug
    $title_slug = sanitize_title($post->post_title);
    $post_link = str_replace('%post_title%', $title_slug, $post_link);

    // Append the office address (post_name) to the URL
    return trailingslashit($post_link) . $post->post_name;
}
add_filter('post_type_link', 'replace_office_permalinks', 10, 2);

Now each office will have a URL like site.com/california/los-angeles/downtown-office/123-main-st/—exactly the structure you need.

4. Add Rewrite Rules for Hierarchical Archives

We need to make site.com/state, site.com/state/city, and site.com/state/city/office-name work as archive pages. Add these rewrite rules:

// Add custom rewrite rules for Office archives
function add_office_rewrite_rules() {
    // Rule 1: site.com/state → Show all offices in this state
    add_rewrite_rule(
        '^([^/]+)/?$',
        'index.php?state=$matches[1]',
        'top'
    );

    // Rule 2: site.com/state/city → Show all offices in this city
    add_rewrite_rule(
        '^([^/]+)/([^/]+)/?$',
        'index.php?state=$matches[1]&city=$matches[2]',
        'top'
    );

    // Rule 3: site.com/state/city/office-name → Show offices matching this name in the city/state
    add_rewrite_rule(
        '^([^/]+)/([^/]+)/([^/]+)/?$',
        'index.php?state=$matches[1]&city=$matches[2]&name=$matches[3]',
        'top'
    );
}
add_action('init', 'add_office_rewrite_rules');

Critical step: After adding these rules, go back to Settings → Permalinks and click "Save Changes"—this flushes WordPress's rewrite rule cache, so the new rules take effect.

5. Create Custom Archive Templates

To style these archive pages, create template files in your theme directory:

  • State archives: taxonomy-state.php → Automatically used for site.com/state URLs. Use this to list all offices in the selected state.
  • City archives: taxonomy-city.php → Automatically used for site.com/state/city URLs. List all offices in the selected city.
  • Office name archives: Modify archive-office.php (or create a custom template) to filter posts by the name query parameter, showing offices with the matching name in the selected city/state.

Example template code for taxonomy-state.php:

<?php get_header(); ?>

<div class="state-archive">
    <h1>Offices in <?php single_term_title(); ?></h1>
    <?php if (have_posts()) : ?>
        <ul class="office-grid">
            <?php while (have_posts()) : the_post(); ?>
                <li>
                    <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
                    <p>Address: <?php echo basename(get_permalink()); ?></p>
                </li>
            <?php endwhile; ?>
        </ul>
    <?php else : ?>
        <p>No offices found in this state.</p>
    <?php endif; ?>
</div>

<?php get_footer(); ?>

6. Key Notes

  • Always assign each office to a State and City—if either is missing, the permalink will break.
  • If you get 404 errors, flush rewrite rules again (save permalinks settings) or check for slug conflicts (e.g., a Page named "california" will clash with a State taxonomy slug of "california").
  • You can auto-generate the office address slug by hooking into save_post and setting $post->post_name to your address field value—just make sure to sanitize it first.

内容的提问来源于stack exchange,提问作者Charles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:30:13