我正在尝试创建不同的社区,每个社区都有自己的页面集(About,Services等)。我目前设置的永久链接结构是sitename.com/community/state/city/parent-page-name/。城市和州是从一个位置自定义分类中提取的,城市是州下的子分类。如果我想为一个名为堪萨斯州托皮卡的橡树社区创建一个About页面,那么url应该是:sitename.com/community/ks/topeka/the-oaks/about然而,当我尝试创建多个社区,其中包含许多不同的关于页面时,所有关于页面默认为发布的第一个社区的相同关于页面。
我的自定义帖子类型如下所示:
function community_post_type() {
$singular = 'Community';
$plural = 'Communities';
register_post_type('community',
array(
'labels' => array(
'name' => __($plural, 'base'),
'singular_name' => __($singular, 'base'),
'all_items' => __('All ' . $plural, 'base'),
'add_new' => __('Add New ' . $singular, 'base'),
'add_new_item' => __('Add New ' . $singular, 'base'),
'edit' => __('Edit ' . $singular, 'base'),
'edit_item' => __('Edit ' . $singular, 'base'),
'new_item' => __('New ' . $singular, 'base'),
'view_item' => __('View ' . $singular, 'base'),
'search_items' => __('Search ' . $plural, 'base'),
'not_found' => __('Nothing found in the Database.', 'base'),
'not_found_in_trash' => __('Nothing found in Trash', 'base'),
'parent_item_colon' => 'Main Community',
),
'hierarchical' => true,
'description' => __('This is the ' . $singular . ' post type', 'base'),
'public' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'show_ui' => true,
'query_var' => true,
'menu_icon' => 'dashicons-location-alt',
'has_archive' => true,
'capability_type' => 'page',
'supports' => array('title', 'editor', 'revisions', 'thumbnail', 'excerpt', 'page-attributes', 'custom-fields'),
'show_in_rest' => true,
'menu_position' => 4,
'taxonomies' => array( 'location' ),
'rewrite' => array('slug' => 'community/%comm%'),
)
);
}
下面是我修改永久链接的代码:
function change_permalinks( $post_link, $id = 0){
$post = get_post($id);
if ( is_object( $post ) && $post->post_type == 'community' ){
$terms = wp_get_object_terms( $post->ID, 'location' );
if( $terms ){
return str_replace( '%comm%' , $terms[0]->slug .'/'. $terms[1]->slug , $post_link );
}
}
return $post_link;
}
add_filter( 'post_type_link', 'change_permalinks', 1, 3 );
function generated_rewrite_rules() {
add_rewrite_rule(
'^community/(.*)/(.*)/(.*)/?$',
'index.php?post_type=community&name=$matches[3]',
'top'
);
}
add_action( 'init', 'generated_rewrite_rules' );
如果我使用大约1,大约2,大约3等作为页面插件,那么它工作得很好,但我不能使用相同的插件,否则它只是去同一页的700个位置的每一个。
1条答案
按热度按时间nimxete21#
您可以使用这个可用查询变量列表来调整您的url,以接收所需的任何帖子
https://codex.wordpress.org/WordPress_Query_Vars
我想对于你的情况,它可能看起来像这样,我还没有测试过,但它是一个提示,你去
这将告诉wordpress从第一个匹配中获得具有分类位置和特定状态的帖子。
当然,您可以调整它以更准确地匹配您的结果,或者在您的post模板文件中使用thoose query_vars来更正确地构建 get_post/WP_Query 的参数。可以这么说,您可以在此处找到一个示例来说明它的外观
https://developer.wordpress.org/reference/classes/wp_query/#taxonomy-parameters
我还建议,如果它没有按预期工作,则将钩子连接到pre_get_posts,打印出查询并检查它的外观,以便进一步调试
示例: