カスタム投稿タイプ、分類法、パーマリンク


62

これは私を夢中にさせており、それは単純だと確信していますが、私が探しているものは単純な構造になりません(すべてが非常に複雑です)。

カスタムの投稿タイプproduct_listingとカスタムの分類product_cat(階層的であり、同様のカテゴリを持つ必要があります)があります。

URLを次のようにしたいだけです。

mysite.com/products/category1/product-name1 
mysite.com/products/category2/product-name2

しかし、私の人生では、私が何をしていても、恐ろしい404号を受け取っています。ページは正常に機能し、投稿は正常に機能しますが、カスタム投稿は正常に機能しません。それらは次のように表示されます:

mysite.com/products/product-name1
mysite.com/products/product-name2

これは実際に動作します!そこに自分のカスタム分類を表示したいだけでなく、次のようtaxonomy.phpにしてセットアップしたテンプレートにアクセスできるようにしたいだけです。

mysite.com/products/category1/
mysite.com/products/category2/

私のナメクジはどれも同じではありません。ここに私のfunctions.phpファイルの投稿タイプと分類の部分があります:

///// CUSTOM POST TYPES /////

// register the new post type
register_post_type( 'product_listing', array( 
    'labels'                 => array(
        'name'               => __( 'Products' ),
        'singular_name'      => __( 'Product' ),
        'add_new'            => __( 'Add New' ),
        'add_new_item'       => __( 'Create New Product' ),
        'edit'               => __( 'Edit' ),
        'edit_item'          => __( 'Edit Product' ),
        'new_item'           => __( 'New Product' ),
        'view'               => __( 'View Products' ),
        'view_item'          => __( 'View Product' ),
        'search_items'       => __( 'Search Products' ),
        'not_found'          => __( 'No products found' ),
        'not_found_in_trash' => __( 'No products found in trash' ),
        'parent'             => __( 'Parent Product' ),
    ),
    'description'           => __( 'This is where you can create new products on your site.' ),
    'public'                => true,
    'show_ui'               => true,
    'capability_type'       => 'post',
    'publicly_queryable'    => true,
    'exclude_from_search'   => false,
    'menu_position'         => 2,
    'menu_icon'             => get_stylesheet_directory_uri() . '/images/tag_orange.png',
    'hierarchical'          => true,
    '_builtin'              => false, // It's a custom post type, not built in!
    'rewrite'               => array( 'slug' => 'products', 'with_front' => true ),
    'query_var'             => true,
    'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );


//hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');

//create two taxonomies, genres and writers for the post type "book"
function create_product_taxonomies() {
    // Add new taxonomy, make it hierarchical (like categories)
    $labels = array(
        'name'              => _x( 'Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Category', 'taxonomy singular name' ),
        'search_items'      =>  __( 'Search Categories' ),
        'all_items'         => __( 'All Categories' ),
        'parent_item'       => __( 'Parent Categories' ),
        'parent_item_colon' => __( 'Parent Categories:' ),
        'edit_item'         => __( 'Edit Category' ), 
        'update_item'       => __( 'Update Category' ),
        'add_new_item'      => __( 'Add New Category' ),
        'new_item_name'     => __( 'New Category Name' ),
        'menu_name'         => __( 'Category' ),
    );  

    register_taxonomy( 'product_cat', array( 'product_listing' ), array(
        'hierarchical'  => true,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => true,
        'rewrite'       => array( 'slug' => '%category%', 'with_front' => true ),
    ) );

    // Add new taxonomy, NOT hierarchical (like tags)
    $labels = array(
        'name'                       => _x( 'Scents', 'taxonomy general name' ),
        'singular_name'              => _x( 'Scent', 'taxonomy singular name' ),
        'search_items'               =>  __( 'Search Scents' ),
        'popular_items'              => __( 'Popular Scents' ),
        'all_items'                  => __( 'All Scents' ),
        'parent_item'                => null,
        'parent_item_colon'          => null,
        'edit_item'                  => __( 'Edit Scent' ), 
        'update_item'                => __( 'Update Scent' ),
        'add_new_item'               => __( 'Add New Scent' ),
        'new_item_name'              => __( 'New Scent Name' ),
        'separate_items_with_commas' => __( 'Separate scents with commas' ),
        'add_or_remove_items'        => __( 'Add or remove scents' ),
        'choose_from_most_used'      => __( 'Choose from the most used scents' ),
        'menu_name'                  => __( 'Scents' ),
    ); 

    register_taxonomy( 'scent', 'product_listing', array(
        'hierarchical'  => false,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => array( 'slug' => 'scents' ),
    ) );
}

また、別のカスタム分類もありますがscents、理想的にはある種のわかりやすいURLを持ちたいのですが、これについてはもっとオープンにしています。に行ってすべての香りのリストにアクセスしたいのですmysite.com/products/scentsが、カテゴリ固有である必要はありません。

誰も私を助けることができますか?

回答:


63

slug投稿タイプ引数をproducts/%product_cat%に変更し、slug分類引数をjust productsに変更してから、書き換えルールをフラッシュします。WordPressで処理できるようになりました/products/my-product-cat/post-name/

最後に、WordPressでパーマリンクの生成を少し支援する必要があります(そのまま使用すると、permastructタグが認識されません%product_cat%)。

/**
 * Inject term slug into custom post type permastruct.
 * 
 * @link   http://wordpress.stackexchange.com/a/5313/1685
 * 
 * @param  string  $link
 * @param  WP_Post $post 
 * @return array
 */
function wpse_5308_post_type_link( $link, $post ) {
    if ( $post->post_type === 'product_listing' ) {
        if ( $terms = get_the_terms( $post->ID, 'product_cat' ) )
            $link = str_replace( '%product_cat%', current( $terms )->slug, $link );
    }

    return $link;
}

add_filter( 'post_type_link', 'wpse_5308_post_type_link', 10, 2 );

注意すべきことの1つは、これは名前順に並べられた投稿の最初の製品カテゴリを取得するだけです。単一の製品に複数のカテゴリを割り当てる場合、パーマリンクで使用するカテゴリを決定する方法を簡単に変更できます。

Lemmeはあなたがこれにどのように取り組むかを知っており、他の問題に取り組むことができます!


ああすごい!これはうまくいきました!最後に!私はこれまでに何も思いませんでした!!! 本当にありがとうございます!!! ............では、リンク(the_permalinkのようなもの)を生成して、タクソノミーのURLを取得する方法を教えてください。/ products / my-product-cat /
ロデオラムジー

私はそれがうまくいったと思います^^^ ............しかし今、私はページネーションにこだわっています。/ products / my-product-cat /は正常に見えますが、/ products / my-product-cat / page / 2 /は404を返し、taxonomy.phpファイルをindex.phpファイルのおかげ。私は見つけることができるすべてを試してみましたが、まだ何もしていません。
ロデオラムジー

1
単一の製品の書き換えを変更することを検討しproduct/cat-name/product-nameますか?(特異性に注意してください)問題は、分類のページネーションの書き換えルールがトリガーされないことです。これは、単一の製品の以前のルールによってキャッチされるためです。
TheDeadMedic

私はそれにオープンです。しかし、私の頭を包むために、単一の製品ページと「カテゴリ」ページを表示している場合、製品は異なるURLパスを持つことになりますか?したがって、singleはproduct / cat-name / prod-nameですが、catsはproducts / cat-name /になりますか?そのようなことは、「人間に優しい」URLの目的を打ち負かさないでしょうか?その違いは言うまでもなく、クライアントがwpダッシュボードを習得するのに苦労しています...誤解されている場合は、plsからお知らせください!product-cat / product-namやちょうどproduct-cat /などのフロントディレクトリがないことに満足するかもしれません。それは機能しますか?
ロデオラムジー

2
アーカイブ()と特異なアイテム()には明確な区別があるため、「人間に優しい」と言います。いいえ、「フロントディレクトリ」を保持します-投稿やページとの明確な区別を維持するのに役立ちます。そうしないと、パフォーマンスの問題(冗長な書き換えルール)が発生する可能性があります。products/product/
TheDeadMedic

6

@TheDeadMechanicに感謝します、あなたの答えは私を助けましたが、部分的にしか助けませんでした。@RodeoRamseyが要求したのと同じことをしたかったのですが、ネストされたカテゴリ(つまり:)を使用するmysite.com/products/category1/child-category-1/grandchild-category-1/product-nameと、ソリューションが機能しませんでした。

私はついに私の質問に対する拡張ソリューションを思いついたので、他の誰かがネストされたカテゴリー/サブカテゴリーを必要とするなら、私自身の質問に関する詳細なソリューションを見ることができます。それが他の人を助けることを願っています、そして最初のステップに感謝します。


4

wpがすぐにその構造をサポートするかどうかはわかりませんが、そうするための独自の書き換えルールを非常に簡単に作成できます。

以前の回答はこちらAuthor url rewriteをご覧ください。

行を変更できます

$newrules['author/([^/]+)/songs/?$'] = 'index.php?post_type=songs&author=$matches[1]';

のようなものに

$newrules['products/([^/]+)/([^/]+)/?$'] = 'index.php?post_type=product_listing&product_cat=$matches[1]&name=$matches[2]';

ここのproduct_cat部分は不要かもしれません-必要かどうかはわかりません。

好きなルールを追加できます。ルールは組み込みのルールよりも優先されます。


まあ、それは面白くないです。ああ、カスタム書き換えルールは私を超えていると思います。上記のコード(および他の投稿の残りのコード)を試しましたが、何も変わりませんでした。すべてをフラッシュした後、再度変更を試みましたが、変更はありませんでした。そのため、カスタム投稿タイプと分類法で設定されたすべての書き換えルールをコメントアウトし、フラッシュしましたが、まだ何もしていません。
ロデオラムジー

2

ええ、カスタム投稿タイプのパーマリンクを設定する前に、私は夢中になりました。カスタム投稿タイプを処理するプラグインを見つけました。使い方はとても簡単です。 http://wordpress.org/extend/plugins/custom-post-permalinks/ WPはこれをコア機能として追加する必要があります!レオ


これは以前に見たことがあり、「非階層的」分類法のためにそれを使用することを控えました。階層に設定されたものがあったので、それがうまくいくとは思わなかったが、今のところ、それはトリックを行ったようだ!さらに、私が達成しようとしていた/ products / cat-name / prod-name /構造を達成するために働いているようです(他の回答へのコメントを参照)。@TheDeadMedic、これは実行可能なオプションですか?または、functions.phpファイルの書き換えに固執する必要がありますか?
ロデオラムジー

0

実際、それは非常に簡単です。必要なのは1行だけです。これが私のコードです

関数create_product_taxonomies()
{
//新しい分類を追加し、階層(カテゴリなど)にします
    $ labels = array(
        'name' => _x( 'Categories'、 'taxonomy general name')、
        'singular_name' => _x( 'Category'、 'taxonomy singular name')、
        'search_items' => __( '検索カテゴリ')、
        'all_items' => __( 'All Categories')、
        'parent_item' => __( '親カテゴリ')、
        'parent_item_colon' => __( '親カテゴリ:')、
        'edit_item' => __( 'カテゴリの編集')、
        'update_item' => __( 'Update Category')、
        'add_new_item' => __( 'Add New Category')、
        'new_item_name' => __( '新しいカテゴリ名')、
        'menu_name' => __( 'Category')、
    );

    register_taxonomy( 'product_cat'、array( 'product_listing')、array(
        'hierarchical' => true、
        'labels' => $ labels、
        'show_ui' => true、
        'query_var' => true、
        'rewrite' => array( 'hierarchical' => true)、
    ));

GenerateWP.comからレビューCPTの生成された分類に適用されます。私は自分のWordPressサイトhttps://www.wpstarters.comでこれを使用しています

function reviews_category_taxonomy(){

    $ labels = array(
        'name' => _x( 'Reviews Categories'、 'Taxonomy General Name'、 'reviews_category')、
        'singular_name' => _x( 'Reviews Category'、 'Taxonomy Singular Name'、 'reviews_category')、
        'menu_name' => __( 'Reviews Category'、 'reviews_category')、
        'all_items' => __( 'すべてのレビューカテゴリ'、 'reviews_category')、
        'parent_item' => __( 'Parent Review Category'、 'reviews_category')、
        'parent_item_colon' => __( '親レビューカテゴリ:'、 'reviews_category')、
        'new_item_name' => __( '新しいレビューカテゴリ名'、 'reviews_category')、
        'add_new_item' => __( '新しいレビューカテゴリの追加'、 'reviews_category')、
        'edit_item' => __( 'レビューカテゴリの編集'、 'reviews_category')、
        'update_item' => __( 'レビューカテゴリの更新'、 'reviews_category')、
        'view_item' => __( 'レビューカテゴリの表示'、 'reviews_category')、
        'separate_items_with_commas' => __( 'アイテムをコンマで区切る'、 'reviews_category')、
        'add_or_remove_items' => __( 'アイテムの追加または削除'、 'reviews_category')、
        'choose_from_most_used' => __( '最も使用頻度の高いものから選択'、 'reviews_category')、
        'popular_items' => __( '人気のあるレビューカテゴリ'、 'reviews_category')、
        'search_items' => __( '検索項目'、 'reviews_category')、
        'not_found' => __( 'Not Found'、 'reviews_category')、
        'no_terms' => __( 'レビューカテゴリなし'、 'reviews_category')、
        'items_list' => __( 'Review Categories list'、 'reviews_category')、
        'items_list_navigation' => __( 'カテゴリリストナビゲーションのレビュー'、 'reviews_category')、
    );
    $ args = array(
        'labels' => $ labels、
        'hierarchical' => true、
        'public' => true、
        'show_ui' => true、
        'show_admin_column' => true、
        'show_in_nav_menus' => true、
        'show_tagcloud' => false、
        'show_in_rest' => true、
        'rewrite' => array( 'hierarchical' => true)、
    );
    register_taxonomy( 'reviews_category'、array( 'wps_reviews')、$ args);

}
add_action( 'init'、 'reviews_category_taxonomy'、0);

必要なのは 'rewrite' => array( 'hierarchical' => true)を入れて、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.