web-dev-qa-db-ja.com

URLに複数の分類法を追加する方法

URLに複数の分類法

次のURLに複数の分類法を追加する方法

  • 投稿タイプ: 商品
  • 分類法: product_type
  • 分類法: product_brand


この商品の新しい商品を追加し、種類とブランドを選択します。

新しいproductを追加すると、2つの分類ボックス(product_typeとproduct_brand)があります。この新しい投稿をテスト製品1としましょう。私たちが最初にしたいことは、私が扱っている製品の種類をチェックすることです。例えば、携帯電話としましょう。次に、私はその製品がどのブランドに属しているのかをチェックしたいと思います、samsung。

"テスト製品1"は、タイプ"携帯電話"およびブランド")に関連付けられています。サムスン "

望ましい最終結果は次のとおりです。

//製品
"すべてのカスタム投稿を表示

// products /携帯電話
"分類法の携帯電話ですべてのカスタム投稿を見る

/製品/携帯電話/サムスン/
"分類法が携帯電話 _および_ samsungであるすべてのカスタム投稿を表示

/製品/携帯電話/サムスン/ test-product-1
"製品を表示する(単一のカスタム投稿)


質問

どのようにこれを可能にするでしょうか?私の最初の考えは、"携帯電話""samsung"の親用語として持つという1つの分類法を使用することでした。実際に分類法とその用語を追加することはそれほど難しいことではありませんでした。しかし、それは他にもたくさんの問題を引き起こしました。とにかくそれは404の問題を与え、WPが特定のことを許さないのでそれはそのようには動きません。
WP.org"分類法 - アーカイブ - テンプレート

これは、私がその構造を再考し、分類法とその用語を残しなければならないことにつながりました。 2番目の分類法を作成し、それとポストタイプを関連付けてURLに追加しませんか。

確かに良い質問ですが、どうですか?

8
DRSK

これは確かにある程度あなた自身のいくつかの書き換え規則を利用することによって可能です。 WP_Rewrite APIは、リクエストをクエリに変換するための書き換え規則(または「マップ」)を追加できるようにする関数を公開しています。

良い書き換え規則を書くための前提条件があり、最も重要なものは基本的な正規表現の理解です。 WordPressリライトエンジンは、正規表現を使用してURLの一部をクエリに変換して投稿を取得します。

これ はPHP PCRE(Perl互換の正規表現)に関する短くて良いチュートリアルです。

それで、あなたは2つの分類法を追加しました、それらの名前がであると仮定しよう:

  • 製品の種類
  • product_brand

これらをクエリで使うことができます。

get_posts( array(
    'product_type' => 'cell-phones',
    'product_brand' => 'samsung'
) );

クエリは?product_type=cell-phones&product_brand=samsungになります。クエリとして入力すると、Samsungの電話のリストが表示されます。そのクエリに/cell-phones/samsungを書き直すには、書き換えルールを追加する必要があります。

add_rewrite_rule() はこれをします。上記の場合の書き換え規則の例を次に示します。

add_rewrite_rule( '^products/([^/]*)/([^/]*)/?',
    'index.php?product_type=$matches[1]&product_brand=$matches[2]',
    'top' );

データベースに保存するための書き換えルールを追加したらすぐにflush_rewrite_rules()を作成する必要があります。これは一度だけ行われます。ルールがそこでフラッシュされれば、リクエストごとにこれを行う必要はありません。削除するには、書き換え規則を追加せずに単純にフラッシュします。

ページネーションを追加したい場合は、次のようにして追加できます。

add_rewrite_rule( '^products/([^/]*)/([^/]*)/(\d*)?',
    'index.php?product_type=$matches[1]&product_brand=$matches[2]&p=$matches[3]',
    'top' );
5
soulseekah

最終結果

これは私が得たすべての答えからの部分を使って部分的に思いついたものです:

/**
 * Changes the permalink setting <:> post_type_link
 * Functions by looking for %product-type% and %product-brands% in the URL
 * 
  * products_type_link(): returns the converted url after inserting tags
  *
  * products_add_rewrite_rules(): creates the post type, taxonomies and applies the rewrites rules to the url
 *
 *
 * Setting:         [ produkter / %product-type%  / %product-brand% / %postname% ]
 * Is actually:     [ post-type / taxonomy        /  taxonomy       / postname   ]
 *                   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 * Desired result:  [ products  / cellphones      / Apple           / iphone-4   ]
 */

    // Add the actual filter    
    add_filter('post_type_link', 'products_type_link', 1, 3);

    function products_type_link($url, $post = null, $leavename = false)
    {
        // products only
        if ($post->post_type != 'products') {
            return $url;
        }

        // Post ID
        $post_id = $post->ID;

        /**
         * URL tag <:> %product-type%
         */
            $taxonomy = 'product-type';
            $taxonomy_tag = '%' . $taxonomy . '%';

            // Check if taxonomy exists in the url
            if (strpos($taxonomy_tag, $url) <= 0) {

                // Get the terms
                $terms = wp_get_post_terms($post_id, $taxonomy);

                if (is_array($terms) && sizeof($terms) > 0) {
                    $category = $terms[0];
                }

                // replace taxonomy tag with the term slug » /products/%product-type%/productname
                $url = str_replace($taxonomy_tag, $category->slug, $url);
            }

        /** 
         * URL tag <:> %product-brand%
         */
        $brand = 'product-brand';
        $brand_tag = '%' . $brand . '%';

        // Check if taxonomy exists in the url
        if (strpos($brand_tag, $url) < 0) {
            return $url;
        } else { $brand_terms = wp_get_post_terms($post_id, $brand); }

        if (is_array($brand_terms) && sizeof($brand_terms) > 0) {
            $brand_category = $brand_terms[0];
        }

        // replace brand tag with the term slug and return complete url » /products/%product-type%/%product-brand%/productname
        return str_replace($brand_tag, $brand_category->slug, $url);

    }

    function products_add_rewrite_rules() 
    {
        global $wp_rewrite;
        global $wp_query;

        /**
         * Post Type <:> products
         */

            // Product labels
            $product_labels = array (
                'name'                  => 'Products',
                'singular_name'         => 'product',
                'menu_name'             => 'Products',
                'add_new'               => 'Add product',
                'add_new_item'          => 'Add New product',
                'edit'                  => 'Edit',
                'edit_item'             => 'Edit product',
                'new_item'              => 'New product',
                'view'                  => 'View product',
                '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'
            );

            // Register the post type
            register_post_type('products', array(
                'label'                 => 'Products',
                'labels'                => $product_labels,
                'description'           => '',
                'public'                => true,
                'show_ui'               => true,
                'show_in_menu'          => true,
                'capability_type'       => 'post',
                'hierarchical'          => true,
                'rewrite'               => array('slug' => 'products'),
                'query_var'             => true,
                'has_archive'           => true,
                'menu_position'         => 5,
                'supports'              => array(
                                            'title',
                                            'editor',
                                            'excerpt',
                                            'trackbacks',
                                            'revisions',
                                            'thumbnail',
                                            'author'
                                        )
                )
            );

        /**
         * Taxonomy <:> product-type
         */
            register_taxonomy('product-type', 'products', array(
                'hierarchical' => true, 
                'label' => 'Product Types', 
                'show_ui' => true, 
                'query_var' => true, 
                'rewrite' => array('slug' => 'products/types'),
                'singular_label' => 'Product Types') 
            );

        /**
         * Taxonomy <:> product-type
         */
            register_taxonomy('product-brand', 'products', array(
                'hierarchical' => true, 
                'label' => 'Product Brands', 
                'show_ui' => true, 
                'query_var' => true, 
                'rewrite' => array('slug' => 'product/brands'),
                'singular_label' => 'Product Brands') 
            );

            $wp_rewrite->extra_permastructs['products'][0] = "/products/%product-type%/%product-brand%/%products%";

            // flush the rules
            flush_rewrite_rules();
    }

    // rewrite at init
    add_action('init', 'products_add_rewrite_rules');


いくつかの考え:

これはうまくいきます。両方の分類法を各投稿に割り当てるには 'required' としますが、URLの末尾に'/'"'/products/taxonomy//postname'が付きます。タイプとブランドを含めて、両方の分類法をすべてのprocutsに割り当てるつもりなので、このコードは私のニーズに合っているようです。誰かが何か提案や改善点を持っている場合は返信して自由に感じます!

3
DRSK

正確なURL構造ではありませんが、次のようになります。

//製品
"すべてのカスタム投稿を表示

/products/type /携帯電話
"分類法の携帯電話ですべてのカスタム投稿を見る

//製品/タイプ/携帯電話/ブランド/サムスン
"分類法が携帯電話 _および_ samsungであるすべてのカスタム投稿を表示

// brand/samsung
"分類法がサムスンであるすべてのカスタム投稿を表示

// product/test-product-1
"製品を表示する(単一のカスタム投稿)

カスタムの書き換え規則を指定する必要はありません。

ただし、分類法とカスタム投稿タイプを特定の順序で登録する必要があります。その秘訣は、カスタム投稿タイプを登録する前に、投稿タイプのスラッグで始まる分類基準を登録することです。たとえば、次のスラッグを仮定します。

product_type taxonomy slug               = products/type
product custom_post_type slug            = product
product custom_post_type archive slug    = products
product_brand taxonomy slug              = brand

それからあなたはこの順番でそれらを登録することができます:

register_taxonomy( 
    'products_type', 
    'products', 
        array( 
            'label' => 'Product Type', 
            'labels' => $product_type_labels,
            'public' => true, 
            'show_ui' => true, 
            'show_in_nav_menus' => true, 
            'args' => array( 'orderby' => 'term_order' ),
            'rewrite' => array( 'slug' => 'products/type', 'with_front' => false  ),
            'has_archive' => true,
            'query_var' => true, 
        ) 
);

register_post_type('products', array(
    'labels' =>$products_labels,
    'singular_label' => __('Product'),
    'public' => true,
    'show_ui' => true,
    'capability_type' => 'post',
    'hierarchical' => false,
    'rewrite' => array('slug' => 'product', 'with_front' => false ),
    'has_archive' => 'products',
    'supports' => array('title', 'editor', 'thumbnail', 'revisions','comments','excerpt'),
 ));

register_taxonomy( 
    'products_brand', 
    'products', 
        array( 
            'label' => 'Brand', 
            'labels' => $products_brand_labels,
            'public' => true, 
            'show_ui' => true, 
            'show_in_nav_menus' => true, 
            'args' => array( 'orderby' => 'term_order' ),
            'rewrite' => array( 'slug' => 'brand', 'with_front' => false  ),
            'has_archive' => true,
            'query_var' => true, 
        ) 
);

絶対に次のようなURLが必要な場合

/製品/タイプ/携帯電話/ブランド/サムスン/テスト商品-1
"製品を表示する(単一のカスタム投稿)

その場合は、次のような書き換え規則が必要になります。

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

_ update _ https://stackoverflow.com/questions/3861291/multiple-custom-permalink-structures-in-wordpress

これが、単一の投稿URLを正しく再定義する方法です。

カスタム投稿タイプの場合は、re-writeをfalseに設定します。 (アーカイブはそのままにしておく)そして分類と投稿を登録した後、以下の書き換え規則も登録する。

  'rewrite' => false

   global $wp_rewrite;
   $product_structure = '/%product_type%/%brand%/%product%';
   $wp_rewrite->add_rewrite_tag("%product%", '([^/]+)', "product=");
   $wp_rewrite->add_permastruct('product', $product_structure, false);

次にpost_type_linkをフィルター処理して目的のURL構造を作成し、未設定の分類値を考慮します。リンクされている記事のコードを修正すると、次のようになります。

function product_permalink($permalink, $post_id, $leavename){
    $post = get_post($post_id);

    if( 'product' != $post->post_type )
         return $permalink;

    $rewritecode = array(
    '%product_type%',
    '%brand%',
    $leavename? '' : '%postname%',
    $leavename? '' : '%pagename%',
    );

    if('' != $permalink && !in_array($post->post_status, array('draft', 'pending', 'auto-draft'))){

        if (strpos($permalink, '%product_type%') !== FALSE){

            $terms = wp_get_object_terms($post->ID, 'product_type'); 

            if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))  
               $product_type = $terms[0]->slug;
            else 
               $product_type = 'unassigned-artist';         
        }

        if (strpos($permalink, '%brand%') !== FALSE){
           $terms = wp_get_object_terms($post->ID, 'brand');  
           if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) 
               $brand = $terms[0]->slug;
           else 
               $brand = 'unassigned-brand';         
        }           

        $rewritereplace = array(
           $product_type,
           $brand,
           $post->post_name,
           $post->post_name,
        );

        $permalink = str_replace($rewritecode, $rewritereplace, $permalink);
    }
    return $permalink;
}

add_filter('post_type_link', 'product_permalink', 10, 3);

今すぐ私はちょうど主要なブランドタグなしでブランド分類URLを書き直す方法を考え出す必要があります、そして私はあなたの望むURLに正確に一致するべきです。

1
marfarma

この方法をチェックしてください、それはまだブランドアーカイブに関するいくつかのバグがあります

http://Pastebin.com/t8SxbDJy

add_filter('post_type_link', 'products_type_link', 1, 3);

function products_type_link($url, $post = null, $leavename = false)
{
// products only
    if ($post->post_type != self::CUSTOM_TYPE_NAME) {
        return $url;
    }

    $post_id = $post->ID;

    $taxonomy = 'product_type';
    $taxonomy_tag = '%' . $taxonomy . '%';

    // Check if exists the product type tag
    if (strpos($taxonomy_tag, $url) < 0) {
        // replace taxonomy tag with the term slug: /products/%product_type%/samsumng/productname
        $url = str_replace($taxonomy_tag, '', $url);
    } else {
        // Get the terms
        $terms = wp_get_post_terms($post_id, $taxonomy);

        if (is_array($terms) && sizeof($terms) > 0) {
            $category = $terms[0];
            // replace taxonomy tag with the term slug: /products/%product_type%/samsumng/productname
            $url = str_replace($taxonomy_tag, $category->slug, $url);
        }
        }

    /* 
     * Brand tags 
     */
    $brand = 'product_brand';
    $brand_tag = '%' . $brand . '%';

    // Check if exists the brand tag 
    if (strpos($brand_tag, $url) < 0) {
        return str_replace($brand_tag, '', $url);
    }

    $brand_terms = wp_get_post_terms($post_id, $brand);

    if (is_array($brand_terms) && sizeof($brand_terms) > 0) {
        $brand_category = $brand_terms[0];
    }

    // replace brand tag with the term slug: /products/cell-phone/%product_brand%/productname 
    return str_replace($brand_tag, $brand_category->slug, $url);
}

function products_add_rewrite_rules() 
{
global $wp_rewrite;
global $wp_query;

register_post_type('products', array(
    'label' => 'Products',
    'description' => 'GVS products and services.',
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'capability_type' => 'post',
    'hierarchical' => true,
    'rewrite' => array('slug' => 'products'),
    'query_var' => true,
    'has_archive' => true,
    'menu_position' => 6,
    'supports' => array(
        'title',
        'editor',
        'excerpt',
        'trackbacks',
        'revisions',
        'thumbnail',
        'author'),
    'labels' => array (
        'name' => 'Products',
        'singular_name' => 'product',
        'menu_name' => 'Products',
        'add_new' => 'Add product',
        'add_new_item' => 'Add New product',
        'edit' => 'Edit',
        'edit_item' => 'Edit product',
        'new_item' => 'New product',
        'view' => 'View product',
        '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'),
    ) 
);

register_taxonomy('product-categories', 'products', array(
    'hierarchical' => true, 
    'label' => 'Product Categories', 
    'show_ui' => true, 
    'query_var' => true, 
    'rewrite' => array('slug' => 'products'),
    'singular_label' => 'Product Category') 
);

$wp_rewrite->extra_permastructs['products'][0] = "/products/%product_type%/%product_brand%/%products%";

    // product archive
    add_rewrite_rule("products/?$", 'index.php?post_type=products', 'top');

    /* 
     * Product brands
     */
    add_rewrite_rule("products/([^/]+)/([^/]+)/?$", 'index.php?post_type=products&product_brand=$matches[2]', 'top');
    add_rewrite_rule("products/([^/]+)/([^/]+)/page/([0-9]{1,})/?$", 'index.php?post_type=products&product_brand=$matches[2]&paged=$matches[3]', 'top');

    /*
     * Product type archive
     */
    add_rewrite_rule("products/([^/]+)/?$", 'index.php?post_type=products&product_type=$matches[1]', 'top');    
    add_rewrite_rule("products/([^/]+)/page/([0-9]{1,})/?$", 'index.php?post_type=products&product_type=$matches[1]&paged=$matches[1]', 'bottom'); // product type pagination

    // single product
    add_rewrite_rule("products/([^/]+)/([^/]+)/([^/]+)/?$", 'index.php?post_type=products&product_type=$matches[1]&product_brand=$matches[2]&products=$matches[3]', 'top');



flush_rewrite_rules();

}

add_action('init', 'products_add_rewrite_rules');
1
Luis Abarca