Rewrite slug выдает ошибку 404
Суть такая: нужно получить ссылки на кастомные записи вида:
сайт/выбранный_термин_таксономии_type/название_поста.
Обновляю постоянные ссылки, но все равно на страницах записей выдает 404 ошибку. Что делаю не так или как правильно сделать как хочу?
1.регистрирую кастомную таксономию
register_taxonomy('type_cases',array('cases'), array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => false,
'show_in_rest' => true,
'publicly_queryable' => false,
));
- регистрирую кастомный тип записи
$args = [
'labels' => [
'name' => 'Кейсы',
'singular_name' => 'Кейс',
'add_new' => 'Добавить новый кейс',
'search_items' => 'Поиск кейсов',
'not_found' => 'Кейсов не было найдено',
],
'description' => 'Кейсы',
'menu_icon' => 'dashicons-format-gallery',
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'query_var' => true,
'rewrite' => array( 'slug'=>'%typesq%', 'with_front'=>false, 'pages'=>false, 'feeds'=>false, 'feed'=>false ),
//'rewrite' => true,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title'),
'taxonomies' => array( 'type_cases' ),
];
register_post_type( 'cases', $args );
- Применяю правило замены slug
add_filter( 'post_type_link', 'types_permalink', 1, 2 );
function types_permalink( $permalink, $post ){
// выходим если это не наш тип записи: без холдера %types%
if( strpos( $permalink, '%typesq%' ) === false )
return $permalink;
// Получаем элементы таксы
$terms = get_the_terms( $post, 'type_cases' );
// если есть элемент заменим холдер
if( ! is_wp_error( $terms ) && !empty( $terms ) && is_object( $terms[0] ) )
$term_slug = array_pop( $terms )->slug;
// элемента нет, а должен быть...
else
$term_slug = 'no-type';
return str_replace( '%typesq%', $term_slug, $permalink );
}
Ответы (1 шт):
Автор решения: Beat Lion Heart
→ Ссылка
Решение оказалось очень не простым, я знал в какую сторону копать, но понятия не имел как правильно это сделать. При замене slug нужно научить WP понимать новые ссылки (перезаписанные), они пытаются обратиться к post_type attachment, поэтому создаем такую функцию, которая изменяет запрос изнутри:
add_filter('request', 'rudr_post_type_request', 1, 1 );
function rudr_post_type_request( $query ){
global $wpdb;
$post_type_name = 'cases'; // specify your own here
$tax_name = 'type_cases'; // and here
$slug = $query['attachment']; // when we change the post type link, WordPress thinks that these are attachment pages
// get the post with the given type and slug from the database
$post_id = $wpdb->get_var(
"
SELECT ID
FROM $wpdb->posts
WHERE post_name = '$slug'
AND post_type = '$post_type_name'
"
);
$terms = wp_get_object_terms( $post_id, $tax_name ); // our post should have the terms
if( isset( $slug ) && $post_id && !is_wp_error( $terms ) && !empty( $terms ) ) : // change the query
unset( $query['attachment'] );
$query[$post_type_name] = $slug;
$query['post_type'] = $post_type_name;
$query['name'] = $slug;
endif;
return $query;
}