私は持っています
custom post type -> resources
custom taxonomy -> resources_type
カテゴリベースがフロントではなく末尾に追加されるカスタムパーマリンクが欲しいのですが
例: title "First resource" で新しいリソースを追加し、type = 1として termを割り当てます
入手したもの - http://example.com/resources/resources-type/type1/first-resource
私が欲しいもの - http://example.com/resources/first-resource/resources-type/type1
以下の引数コードをレジスター投稿タイプに使用しています。
'rewrite' => array("slug" => "/resources/resources-type/%resources_type%"),
そして、次のコードを使用して上記のコードの "%resources_type%"を置き換えます。
function wpa_course_post_link( $post_link, $id = 0 ){
$post = get_post($id);
if ( is_object( $post ) ){
$terms = wp_get_object_terms( $post->ID, 'resources_type' );
if( $terms ){
return str_replace( '%resources_type%' , $terms[0]->slug , $post_link );
}
}
return $post_link;
}
add_filter( 'post_type_link', 'wpa_course_post_link', 1, 3 );
次のパーマリンク構造を達成するには、resources
投稿タイプのデフォルトの(指定した)をオーバーライドするだけで(削除する必要はありません):
/resources/%resources%/resources-type/%resources_type% <- preferred
/resources/resources-type/%resources_type%/%resources% <- default
また、 add_permastruct()
- で上書きすることもできます。rewrite
パラメータを指定せずに投稿タイプを登録すると、書き換えのデフォルトはtrue
/enabledになり、スラッグはresources
になります(つまり、 post typeキーまたはslug ):
register_post_type( 'resources', array(
'label' => 'Resources',
'public' => true,
// no need to set the 'rewrite' arg
...
) );
それから、その直後に、次のようにパーマリンク構造をオーバーライドします。
add_permastruct( 'resources', '/resources/%resources%/resources-type/%resources_type%' );
形式は次のとおりです。重要なのは{POST TYPE KEY}
です。あなたの場合はresources
です。
add_permastruct( '{POST TYPE KEY}', '{PERMALINK STRUCTURE}' );
(書き換えルールをフラッシュすることを忘れないでください - パーマリンク設定ページにアクセスしてください。)
/resources/%resources%
を無効にする方法/resources/%resources%
(すなわち/{POST TYPE KEY}/%{POST TYPE KEY}%
)は、パーマリンク構造内に%{POST TYPE KEY}%
が見つかった場合に 自動的に 追加されます。あなたはそのようにそれを削除することができます:
add_filter( 'resources_rewrite_rules', 'filter_resources_rewrite_rules' );
function filter_resources_rewrite_rules( $rules ) {
$pattern = 'resources/([^/]+)/resources-type/';
$p_length = strlen( $pattern );
foreach ( $rules as $regex => $query ) {
if ( $pattern !== substr( $regex, 0, $p_length ) ) {
unset( $rules[ $regex ] );
}
}
return $rules;
}
投稿タイプが階層型の場合、$pattern
はresources/(.+?)/resources-type/
になります。
また、上記のコード/関数を他の投稿タイプで使用したい場合は、基本的にテキスト " resources "を適切な投稿タイプ key に置き換えるだけです。
そのフィルタの詳細については https://developer.wordpress.org/reference/hooks/permastructname_rewrite_rules/ を参照してください。