web-dev-qa-db-ja.com

カスタムパーマリンク - パーマリンクの最後に分類名と用語名を追加

私は持っています

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 );
2
user7459842

次のパーマリンク構造を達成するには、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;
}

投稿タイプが階層型の場合、$patternresources/(.+?)/resources-type/になります。

また、上記のコード/関数を他の投稿タイプで使用したい場合は、基本的にテキスト " resources "を適切な投稿タイプ key に置き換えるだけです。

そのフィルタの詳細については https://developer.wordpress.org/reference/hooks/permastructname_rewrite_rules/ を参照してください。

1
Sally CJ