web-dev-qa-db-ja.com

カスタム投稿タイプ分類のURLリライト

私が達成したいのは、このようなURLのオンラインリスティングカタログです。

www.example.com/drawing-tools/brand/type/material/color/

この例では、 "drawing-tools"という名前のカスタム投稿タイプがあり、4つのカスタム分類法があります。 "brand"、 "type"、 "material"、 "color"

ユーザーが次のようなURLにアクセスした場合

www.example.com/drawing-tools/rotring/mechanical-pencil/plastic/black/

それらの基準に一致するすべてのアイテムを取得します。

難しいのは、すべての分類法がURLに含まれている必要があるということです。だからこのようなもの:

www.example.com/drawing-tools/plastic/black/

単純に404エラーページを返します。

だから私の主な質問です:

そのフォームのURLにすべての分類法を正確に含めることができ、1つの分類法が欠落している場合に404​​エラーページを返すにはどうすればよいですか。

これらのURIセグメントを受け取り、 '複数の分類法の照会' プラグインに基づいて照会に引数として渡し、1つのセグメントが欠落していると404エラーを返すような書き換え規則を作成しようと思いました。しかし、私はこれを達成する方法がわかりません。解決策はありますか。

[アップデート1]

書き換えルールは基本的にこのURLを使用します。

www.example.com/drawing-tools/rotring/mechanical-pencil/plastic/black/

そしてそれを作る:

www.example.com/?drawing-tools_name=rotring+mechanical-pencil+plastic+black

上記の構造は '複数の分類法の照会' プラグインで必要とされます。

[アップデート2]

Query Multiple Taxonomiesプラグインをあきらめ、代わりにWP 3.1に切り替えました。さて、この 前の質問からの助けを借りて 私は私が欲しかったような分類法をうまく働かせることができました。

これが完全なコードです。

register_post_type('drawing-tools', array(
    'labels' => array(
            'name' => __( 'Drawing Tools' ),
            'singular_name' => __( 'Drawing Tool' ),
            'add_new' => __( 'Add New' ),
            'add_new_item' => __( 'Add New Drawing Tool' ),
            'edit' => __( 'Edit' ),
            'edit_item' => __( 'Edit Drawing Tool' ),
            'new_item' => __( 'New Drawing Tool' ),
            'view' => __( 'View Drawing Tools' ),
            'view_item' => __( 'View Drawing Tool' ),
            'search_items' => __( 'Search Drawing Tools' ),
            'not_found' => __( 'No items found' ),
            'not_found_in_trash' => __( 'No items found in trash' ),
            'parent' => __( 'Parent Drawing Tool' ),
            ),
    'public' => true,
    'publicly_queryable' => false,
    'show_in_nav_menus' => false,
    'exclude_from_search' => false,
    'show_ui' => true,
    '_builtin' => false,
    '_edit_link' => 'post.php?post=%d',
    'capability_type' => 'post',
    'hierarchical' => false,
    'rewrite' => array("slug" => "drawing-tools/%brand%/%type%/%material%/%color%"), // Permalinks format
    'has_archive' => false,
    'menu_position' => 5,
    'supports' => array('author')
));

  register_taxonomy('brand',array('drawing-tools'), array(
    'hierarchical' => false,
    'labels' => array(
        'name' => _x( 'Brands', 'taxonomy general name' ),
        'singular_name' => _x( 'Brand', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Brands' ),
        'all_items' => __( 'All Brands' ),
        'parent_item' => __( 'Parent Brand' ),
        'parent_item_colon' => __( 'Parent Brand:' ),
        'edit_item' => __( 'Edit Brands' ), 
        'update_item' => __( 'Update Brand' ),
        'add_new_item' => __( 'Add New Brand' ),
        'new_item_name' => __( 'New Unit Brand' ),
        'menu_name' => __( 'Brands' ),
                ),
    'show_ui' => true,
    'query_var' => true,
    'rewrite' => array( 'slug' => 'drawing-tools' ),
  ));

  register_taxonomy('type',array('drawing-tools'), array(
    'hierarchical' => false,
    'labels' => array(
        'name' => _x( 'Types', 'taxonomy general name' ),
        'singular_name' => _x( 'Type', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Types' ),
        'all_items' => __( 'All Types' ),
        'parent_item' => __( 'Parent Type' ),
        'parent_item_colon' => __( 'Parent Type:' ),
        'edit_item' => __( 'Edit Types' ), 
        'update_item' => __( 'Update Type' ),
        'add_new_item' => __( 'Add New Type' ),
        'new_item_name' => __( 'New Type' ),
        'menu_name' => __( 'Types' ),
                ),
    'show_ui' => true,
    'query_var' => true,
    'rewrite' => array( 'slug' => 'drawing-tools/%brand%' ),
  ));

 register_taxonomy('material',array('drawing-tools'), array(
    'hierarchical' => false,
    'labels' => array(
        'name' => _x( 'Materials', 'taxonomy general name' ),
            'singular_name' => _x( 'Material', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Materials' ),
        'all_items' => __( 'All Materials' ),
        'parent_item' => __( 'Parent Material' ),
        'parent_item_colon' => __( 'Parent Material:' ),
        'edit_item' => __( 'Edit Material' ), 
        'update_item' => __( 'Update Material' ),
        'add_new_item' => __( 'Add New Material' ),
        'new_item_name' => __( 'New Material Name' ),
        'menu_name' => __( 'Materials' ),
                ),
    'show_ui' => true,
    'query_var' => true,
    'rewrite' => array( 'slug' => 'drawing-tools/%brand%/%type%' ),
  ));

 register_taxonomy('color',array('drawing-tools'), array(
    'hierarchical' => false,
    'labels' => array(
        'name' => _x( 'Colors', 'taxonomy general name' ),
        'singular_name' => _x( 'Color', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Colors' ),
        'all_items' => __( 'All Colors' ),
        'parent_item' => __( 'Parent Color' ),
        'parent_item_colon' => __( 'Parent Color:' ),
        'edit_item' => __( 'Edit Color' ), 
        'update_item' => __( 'Update Color' ),
        'add_new_item' => __( 'Add New Color' ),
        'new_item_name' => __( 'New Color Name' ),
        'menu_name' => __( 'Colors' ),
                ),
    'show_ui' => true,
    'query_var' => true,
    'rewrite' => array( 'slug' => 'drawing-tools/%brand%/%type%/%material%' ),
  ));  


function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'drawing-tools')
        return $link;

    if ($cats = get_the_terms($post->ID, 'brand'))
        $link = str_replace('%brand%', array_pop($cats)->slug, $link);

    if ($cats = get_the_terms($post->ID, 'type'))
        $link = str_replace('%type%', array_pop($cats)->slug, $link);

    if ($cats = get_the_terms($post->ID, 'material'))
        $link = str_replace('%material%', array_pop($cats)->slug, $link);

    if ($cats = get_the_terms($post->ID, 'color'))
        $link = str_replace('%color%', array_pop($cats)->slug, $link);      
    return $link;
}

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

今、ユーザーがリンクにアクセスすると:

www.example.com/drawing-tools/rotring/mechanical-pencil/plastic/black/

すべてが期待通りに動作します。問題は、ユーザーがこのような部分構造にもアクセスできることです。

www.example.com/drawing-tools/rotring/

そしてそれらの分類法に従って結果を得る。

ユーザーがそのようなURLにアクセスして404エラーメッセージを返さないようにするにはどうすればよいですか。

4
Jaquis

解決策は非常に単純であり、私はそれがコーデックスでそれを見つけるのにそれほど時間がかかった理由を知りません。 $wp_queryクラスを利用する必要があります。

そのため、テンプレートでは、ループを呼び出す前に、返されたデータを保持するための変数を設定します。

$vars = $wp_query->query_vars;

そして、必要な分類法が設定されているかどうかを確認します。

if ( isset( $vars['brand']) && isset( $vars['type'] ) && isset( $vars['material'] ) && isset( $vars['size'] ) )

彼らはループを続けている場合。そうでない場合:

global $wp_query; 
status_header('404');
$wp_query->set_404();

しかし、これが最も最適な解決策であるかどうか、私は疑問に思います。

1
Jaquis

私はWP 3.1があなたが説明していることに対する修正をコーデックスから導入したと思います:

  • カスタムコンテンツタイプの改善 - 開発者はアーカ​​イブページを生成し、より良いメニューと機能コントロールを持つことができます。記事投稿タイプでもっと読んでください。
  • 高度なクエリ - 開発者は複数の分類法やカスタムフィールドをクエリできます

私はまだこれらの改良のどちらも使っていないので、具体的にコメントすることはできませんが、それはあなたが探しているもののようです。がんばろう!

2
Taylor Dewey