web-dev-qa-db-ja.com

同じ分類法を使用した複数のカスタム投稿タイプ= URLフラストレーション

私は2つのカスタム投稿タイプがあります。

  • イベント
  • ビジネス

これら2つのCTPが共有する新しい分類法があります。

  • 場所

「domain.com/events/」にアクセスすると、すべてのイベントのアーカイブが表示され、「domain.com/bususiness/」に移動すると、すべてのビジネスのアーカイブが表示されます。ここまでは順調ですね。

"domain.com/locations/"にアクセスすると、すべてのイベントと企業のアーカイブが表示されます。これは問題ありません。

ただし、イベントの開催地のみを表示するにはどうすればよいですか。 「domain.com/locations/events」または「domain.com/events/locations」は機能しません。

場所の分類法またはCPTのいずれかで書き換え設定を変更する必要がありますか?それは私が立ち往生しているようです!

3
pixelkicks

いくつかの新しい書き換えルールを追加する必要がありますが、ありがたいことにWordPressを使用すると、いくつかの関数呼び出しを使用してかなり簡単になります。

// use the init action to modify rewrite rules
add_action( 'init', function() {
    global $wp_rewrite;

    // add rewrite tag for the post type
    // - %posttype% is a new tag that will be replaced with the regex in the actual query
    // - the regex will extract the post_type name from the URL and use it in the query
    add_rewrite_tag( '%posttype%', '([^/]+)', 'post_type=' );

    // create the new permastruct by combining the post type & taxonomy permastructs
    // - custom taxonomies and post types are added to the extra_permastructs array in WP_Rewrite
    // - change 'category' to desired taxonomy
    // - output will be '%posttype%/category/%category%'
    $types_and_cats_permastruct = '%posttype%' . $wp_rewrite->get_extra_permastruct( 'category' );

    // add the permastruct for post type & taxonomy
    add_permastruct( 'post_type_and_category', $types_and_cats_permastruct, array(
        'with_front' => true,           //  - with_front (bool) - Should the structure be prepended with WP_Rewrite::$front? Default is true.
        'ep_mask' => EP_ALL_ARCHIVES,   //  - ep_mask (int) - Endpoint mask defining what endpoints are added to the structure. Default is EP_NONE.
        'paged' => true,                //  - paged (bool) - Should archive pagination rules be added for the structure? Default is true.
        'feed' => true,                 //  - feed (bool) - Should feed rewrite rules be added for the structure? Default is true.
        'forcomments' => false,         //  - forcomments (bool) - Should the feed rules be a query for a comments feed? Default is false.
        'walk_dirs' => false,           //  - walk_dirs (bool) - Should the 'directories' making up the structure be walked over and rewrite
                                        //    rules built for each in turn? Default is true.
        'endpoints' => true             //  - endpoints (bool) - Should endpoints be applied to the generated rewrite rules? Default is true.
    ) );

} );

したがって、私が上でやっていることを説明するには:

  1. add_rewrite_tag() を使用して書き換えタグを追加すると、URLにカスタム投稿タイプ名(たとえば、/ events/location/uk /)を入力すると、正規表現と結果のクエリによって認識されますWP実行にはpost_type=eventsが含まれます
  2. 追加したタグと既存の分類パーマ構造を使用するためのルールを生成する新しいパーマ構造を作成します。この場合、これは場所になり、/event/location/ukはukイベントを、/business/location/ukはukビジネスを表示します
  3. add_permastruct() を使用して新しいパーマ構造を追加すると、WPがパーマリンクが更新されるたびに新しい書き換えルールを生成します。 3番目のパラメーターでは、walk_dirs/%posttype%/category/のアーカイブでいくつかの望ましくない積極的な書き換えルールを取得するため、/%posttype%/をfalseに設定することが非常に重要です。

落とし穴

  • リンクの生成-the_terms()を使用して、元の投稿タイプのみを表示するビジネスまたはイベントのロケーションリンクを出力する場合は、URLをフィルタリングするか、パーマ構造に一致するようにURLを出力するカスタム関数を記述する必要があります
  • イベントとビジネスの両方をリストするアーカイブが必要ない場合は、用語に投稿があるかどうかを簡単に判断できるため、2つの分類法をお勧めします。リンクを生成し、空のアーカイブへのリンクを出力するかどうかを決定するとき。その場合 @ richard-howarthの答えは正しい
3
sanchothefat

'rewrite'を使用してregister_taxonomy関数を呼び出すときに引数で使用するスラッグを指定できます。

だから、あなたは次のようなものがあるでしょう:

$args = array(
    'labels' => $labels,
    'rewrite' => array( 'slug'=>'events/locations' )
);
register_taxonomy( 'event_location_tax_name', 'event_location_cpt_name', $args );

そして、企業向けに複製します。

$args = array(
    'labels' => $labels,
    'rewrite' => array( 'slug'=>'businesses/locations' )
);
register_taxonomy( 'business_location_tax_name', 'business_location_cpt_name', $args );

それが役立つことを願っていますか。

ありがとうリック

0
Richard Howarth