У меня есть два пользовательских типа сообщений Location
и House
.
Я пытаюсь переписать URL типа домашнего сообщения на /location/%LocationName%/house
Я использовал add_filter('post_type_link', 'postTypeLink', 13, 3)
для замены %LocationName%
, и постоянная ссылка изменилась на нужный мне формат, однако, когда я нажимаю на ссылку, она только выдает ошибку "страница не найдена".
Я напечатал wp_query
и обнаружил, что wp все еще пытается выполнить запрос Location
, но с именем %LocationName%/house
например. Дом имеет пост yellow
. Таким образом, URL domain.com/location/london/house/yellow сделает запрос местоположения с именем /london/house/yellow
вместо запроса дома с именем yellow
. это вызвало страницу, не найденную, поскольку у местоположения нет такого сообщения.
Я пытался использовать add_rewrite_rule
или сохранить постоянную ссылку, но это привело только к тому же результату.
Код ниже.
add_action( 'init', 'rewrite_tag', 10, 0 );
function rewrite_tag() {
add_rewrite_tag( '%locationName%', '([^/]*)/?$', 'locationName=' );
add_rewrite_rule(
'^location/([^/]*)/?$/house',
'index.php?post_type=house&locationName=$matches[1]',
'top');
flush_rewrite_rules(false);
}
$args = array(
'labels' => $labels,
'description' => 'Manage Research Publication',
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'location/%locationName%/house',
'with_front'=> false,
'hierarchical' => true
),
'has_archive' => false,
'hierarchical' => true,
'menu_icon' => 'dashicons-clipboard',
'menu_position' => null,
'supports' => array('title', 'editor', 'thumbnail'),
'show_in_rest' => true,
'rest_base' => 'house',
'taxonomies' => array('category'),
'rest_controller_class' => 'WP_REST_Posts_Controller',
);
register_post_type( 'house', $args );
add_filter('post_type_link', 'postTypeLink', 13, 3);
function postTypeLink($link, $post) {
global $post;
if (get_post_type($post) === 'location') {
$location = a variable from global post
$link = str_replace('%LocationLName%', $location, $link);
}
return $link;
}