我这样解决:
Register Custom Post Type:
function custom_post_articles() {
$labels = array(
\'name\' => _x( \'Articles\', \'post type general name\', \'textdomain\' ),
\'singular_name\' => _x( \'Article\', \'post type singular name\', \'textdomain\' ),
// etc...
);
$args = array(
\'labels\' => $labels,
\'public\' => true,
\'menu_position\' => 5, // Below Posts.
\'menu_icon\' => \'dashicons-megaphone\', // https://developer.wordpress.org/resource/dashicons/
\'capability_type\' => \'post\',
\'hierarchical\' => false, // False like post, True like page.
\'has_archive\' => true, // False like page, True like post.
\'rewrite\' => array(
\'slug\' => \'articles/%articles_tax%\',
\'with_front\' => false
),
\'supports\' => array(
\'title\',
\'editor\',
\'author\',
\'thumbnail\'
)
);
register_post_type( \'articles\', $args );
}
add_action( \'init\', \'custom_post_articles\' );
<小时>
Register Custom Taxonomy:
function taxonomies_product() {
$labels = array(
// labels
);
$args = array(
\'labels\' => $labels,
\'public\' => true,
\'hierarchical\' => true, // False like tag, True like category.
\'rewrite\' => array(
\'slug\' => \'articles\', // Contain lowercase letters and the underscore character (max. 32 char). Default: $taxonomy.
\'with_front\' => false,
\'hierarchical\' => true // Allow hierarchical urls.
)
);
register_taxonomy( \'articles_tax\', \'articles\', $args );
}
add_action( \'init\', \'taxonomies_product\' );
<小时>
RewriteRule for Articles URL Structure:
function rewrite_rules_articles( $rules ) {
$new = array();
$new[ \'articles/([^/]+)/(.+)/?$\' ] = \'index.php?articles=$matches[2]\';
$new[ \'articles/(.+)/?$\' ] = \'index.php?articles_tax=$matches[1]\';
return array_merge( $new, $rules ); // Put these rules first.
}
add_filter( \'rewrite_rules_array\', \'rewrite_rules_articles\' );
<小时>
Replace the placeholder in the URL with the term of the taxonomy:
function handle_placeholder_term_slug( $url, $post ) {
if ( $post->post_type == \'articles\' ) {
if ( $cats = get_the_terms( $post->ID, \'articles_tax\' ) ) {
$url = str_replace( \'%articles_tax%\', current( $cats )->slug, $url );
}
}
return $url;
}
add_filter( \'post_type_link\', \'handle_placeholder_term_slug\', 10, 2 );
<小时>
Remove the placeholder from the yoast breadcrumbs:
function remove_placeholder_yoast_crumb( $link_output, $link ) {
if ( $link[ \'text\' ] == \'Articles\' ) {
$link_output = str_replace( \'/%articles_tax%\', \'\', $link_output );
}
/* in the case of a multilingual site
if ( in_array( $link[ \'text\' ], array( \'Articles\', \'Artikel\', \'Articoli\' ) ) ) {
$link_output = str_replace( \'/%articles_tax%\', \'\', $link_output );
}
*/
return $link_output;
}
add_filter( \'wpseo_breadcrumb_single_link\', \'remove_placeholder_yoast_crumb\', 10 ,2 );