То, чего я хочу достичь, кажется довольно тривиальным, но решение еще не найдено:
Я хочу иметь возможность избежать наличия слага пользовательского постипа (т. Е. article
) и иметь в постоянной ссылке пользовательскую таксономию (т. Е. site_topic
) и ее термин (т. Е. blog
) или, если не установлено, избегайте его и имейте только нормальный заголовок.
Что до сих пор пыталось изменить структуру постоянной ссылки:
(он работает в панели управления, обмениваясь ссылками по мере необходимости, но страницы при посещении приводят к 404, и да постоянные ссылки сбрасывались при каждом редактировании).
function ms_post_types_permalink_edit( $permalink, $post, $leavename ) {
if ( in_array( $post->post_type, [ 'article', 'template' ] ) || 'publish' == $post->post_status ) {
$terms = wp_get_object_terms( $post->ID, 'site_topic' );
if( $terms ){
return str_replace( '/' . $post->post_type . '/', '/' . $terms[0]->slug . '/', $permalink );
}
return str_replace( '/' . $post->post_type . '/', '/', $permalink );
}
return str_replace( '/' . $post->post_type . '/', '/', $permalink );
}
add_filter( 'post_type_link', 'ms_post_types_permalink_edit', 10, 3 );
Мы хотели бы добиться работающей структуры постоянных ссылок, которая работает в обоих случаях для этих пользовательских типов, сохраняя при этом обычную структуру постоянных ссылок для остальных типов:
domain.com / заказ таксономия термина / заказ после названия
domain.com / пост-название
В качестве бонуса пользовательский почтовый тип имеет при регистрации:
....
'rewrite' => [
'with_front' => false,
'slug' => false,
]
....
То, что я также попробовал в сочетании с вышеизложенным, является одновременно следующим или комбинацией из них:
function ms_post_types_rewrite_rule() {
add_rewrite_rule('article/([^/]*)/?$', 'index.php?article=$matches[1]', 'top');
add_rewrite_rule('article/([^/]*)/([^/]*)?$', 'index.php?site_topic=$matches[1]&article="$matches[2]', 'top');
}
add_action('init', 'ms_post_types_rewrite_rule');
и
function ms_pre_get_posts( $query ) {
if ( ! $query->is_main_query() ) {
return;
}
if ( 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
return;
}
if ( ! empty( $query->query['name'] ) ) {
$query->set( 'post_type', [ 'article' ] );
}
}
add_action( 'pre_get_posts', 'ms_pre_get_posts' );