10

製品および製品タイプの正規パーマリンクを作成したいと考えています。カスタム投稿タイプとカスタム分類法を理解しましたが、分類法でパーマリンクを定義できるかどうかはわかりません。たとえば、私のワークフローは次のようになります...

  1. productsというカスタム投稿タイプを作成します。
  2. 次に、商品タイプのカスタム分類を作成します。
  3. 次に、 「椅子」という商品タイプを追加し、「赤い椅子」という商品 をこのカテゴリに追加します。

この製品を作成すると、この製品を表示するために必要なパーマリンク構造は次のようにフォーマットされます ->

http://shop.com/products/chairs/red-chair

これはワードプレス3.4で可能ですか?カスタム投稿タイプのメタボックスを使用すると、カスタム分類法で定義された製品タイプを選択できます。製品ごとに 1 つのタイプしかありません。

可能であれば、選択した製品カテゴリの親も含めたいと思います (たとえば、「椅子」カテゴリが「ラウンジ」カテゴリの子である場合、パーマリンク構造は次のようになります ->

http://shop.com/products/lounge/chairs/red-chair

カスタム投稿タイプとカスタム分類法を作成する方法は次のとおりです。パーマリンクに製品タイプを含めるように書き換え/スラッグルールを定義するのに助けが必要です.

/* Custom Post Type - Products ------- */
function products_init() {
    $args = array(
        'public' => true,
        'label' => 'Products'
    );
    register_post_type( 'products', $args );
}
add_action( 'init', 'products_init' );

/* Custom Taxonomy - Product Type ------- */
add_action( 'init', 'create_prodtype' );
function create_prodtype() {
    $labels = array(
        'name' => _x( 'Product Type', 'products' ),
        'singular_name' => _x( 'Product Category', 'product' ),
        'search_items' =>  __( 'Search Product Types' ),
        'all_items' => __( 'All Product Types' ),
        'parent_item' => __( 'Products' ),
        'parent_item_colon' => __( 'Products:' ),
        'edit_item' => __( 'Edit Product Type' ),
        'update_item' => __( 'Update Product Type' ),
        'add_new_item' => __( 'Add New Product Type' ),
        'new_item_name' => __( 'New Product Type' ),
    );
    register_taxonomy(
        'products',
        array('products'),
        array(
            'rewrite' => array(
                'slug' => 'products',
                'hierarchical' => true
            ), 
            'with_front' => false,
            'labels' => $labels
    ));
}
4

2 に答える 2

15

解決

Jan Fabryによるこれらの投稿の助けを借りてそれを理解しました->

https://wordpress.stackexchange.com/a/5478/10350 https://wordpress.stackexchange.com/a/22490/10350

次のようにカスタム投稿タイプを設定しました->

  • カスタム投稿タイプ (register_post_type) -> 「商品」
  • タクソノミ (register_taxonomy) -> 「製品タイプ」

バックエンド機能

バックエンドに保存されるパーマリンク構造を書き直して、パーマリンクがカスタム分類タイプ「product-type」を含むように保存されるようにします

add_filter('post_type_link', 'product_type_permalink', 10, 4);
function product_type_permalink($post_link, $post, $leavename, $sample) {
    //If is custom post type "product"
    if ($post->post_type == 'product') {
        // Get current post object
        global $post;
        // Get current value from custom taxonomy "product-type"
        $terms = get_the_terms($post->id, 'product-type');
        // Define category from "slug" of taxonomy object
        $term = $terms[0]->slug;
        // Re-structure permalink with string replace to include taxonomy value and post name
        $permalink = str_replace('product/', 'product/' . $term . '/', $post_link);
    }
    return $permalink;
}

パーマリンク設定を「投稿名」にして保存。製品をカテゴリに追加して保存すると、パーマリンクが書き直され、カスタムの分類法定義 (この場合は「製品タイプ」) が含まれるようになります。したがって、「椅子」カテゴリに「赤い椅子」を追加すると、URL は次のような形式になります ->

http://website.com/product/chairs/red-chair/

ただし、このページにアクセスしようとすると、404 エラーが発生します。これは、wordpress がこの URL を使用してデータベースにクエリを実行する方法をまだ認識していないためです。そのため、それを記述する必要があります。

フロントエンド機能

wordpress が URL を取得してデータベースにクエリを実行できるように、書き換えルールを追加する必要があります。wordpress 関数を使用して、add_rewrite_rule指定されたパーマリンクをクエリ文字列に変換します。

add_rewrite_rule(
    // The regex to match the incoming URL
    'product/([^/]+)/([^/]+)/?',
    // The resulting internal URL: `index.php` because we still use WordPress
    // `pagename` because we use this WordPress page
    // `designer_slug` because we assign the first captured regex part to this variable
    'index.php?product-type=$matches[1]&product=$matches[2]',
    // This is a rather specific URL, so we add it to the top of the list
    // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
    'top'
);

この関数では、指定された文字列を各スラッシュで展開する Wordpress によって、matches 配列が定義されます。したがって、この例では、正規表現([^/]+)を使用して、各スラッシュの間にあるものと一致させています。この例では 2 つのレベルがあるため、製品タイプ、製品の順に一致し、製品タイプ = $matches 1および製品 = $matches[2] である match 配列にそれらを追加します。

この書き換えルールはこれを変換します ->

product/chairs/red-chair/

これに - >

index.php?product-type=chair&product=red-chair

当社のデータベースがデータベースにクエリを実行し、フォーマットされたパーマリンクを含む正しい製品ページを返すために使用できるもの。

これにより、URL に product-type という 1 つのレベルしかないため、product-type ページが表示されなくなります。これは、現在、書き換えルールが常にクエリ文字列で定義されている製品名を識別しようとすることを意味します。したがって、このために、単一レベルの書き換えルールも作成します。

add_rewrite_rule('^product/([^/]*)?$','index.php?product-type=$matches[1]','top');

これにより、製品タイプ ページのクエリも実行されるため、さまざまな製品タイプを表示したい場合は、それらにリンクしようとしたときに 404 エラーをスローすることなく、通常どおりタクソノミーをループすることができます。

欠点

これは現在、単一レベルの分類のみを使用するため、カスタム分類構造を階層化することはできません。複数のタクソノミーを指定すると、パーマリンクを定義するために最初の ID を持つ最も多くのタクソノミーが使用されます。これを回避するには、カスタム投稿タイプのサイドバーに表示されるカスタム分類メニューを非表示にし、選択ボックスのみを使用できる分類のメタ ボックスを追加します。これにはMeta Box プラグインを使用します。(注意: このプラグインには管理メニューがありません。配列を作成するだけで、functions.php にカスタム投稿タイプのメタ ボックスを記述できます - 強くお勧めします!)

于 2012-11-26T16:53:05.120 に答える
1

@reekogiこれは、製品のカスタム投稿タイプでは正しく機能しますが、他のすべての投稿タイプを壊します.

add_filter('post_type_link', 'product_type_permalink', 10, 4);
function product_type_permalink($post_link, $post, $leavename, $sample) {
    //If is custom post type "product"
    if ($post->post_type == 'product') {
        // Get current post object
        global $post;
        // Get current value from custom taxonomy "product-type"
        $terms = get_the_terms($post->id, 'product-type');
        // Define category from "slug" of taxonomy object
        $term = $terms[0]->slug;
        // Re-structure permalink with string replace to include taxonomy value and post name
        $permalink = str_replace('product/', 'product/' . $term . '/', $post_link);
    }
    return $permalink;
}

修正は、変数 $post_link と $permalink を $url に変更することです

function product_type_permalink($url, $post, $leavename, $sample) {
    //If is custom post type "product"
    if ($post->post_type == 'product') {
        // Get current post object
        global $post;
        // Get current value from custom taxonomy "product-type"
        $terms = get_the_terms($post->id, 'product-type');
        // Define category from "slug" of taxonomy object
        $term = $terms[0]->slug;
        // Re-structure permalink with string replace to include taxonomy value and post name
        $url = str_replace('product/', 'product/' . $term . '/', $url);
    }
    return $url;
}
add_filter('post_type_link', 'product_type_permalink', 10, 4);
于 2015-08-21T13:47:37.653 に答える