Como eu adiciono várias taxonomias ao URL?

8

Várias taxonomias no URL

Como adicionar várias taxonomias ao URL com o seguinte:

  
  • Tipo de postagem: produtos
  •   
  • Taxonomia: product_type
  •   
  • Taxonomia: product_brand
  •   


Adicionando novo produto e selecionando tipo e marca para este produto:

Ao adicionar um novo produto , há duas caixas de taxonomia (product_type e product_brand). Vamos chamar esse novo post Produto de teste 1 . A primeira coisa que queremos fazer é assinalar que tipo de produto eu estou lidando, digamos telefones celulares . Em seguida, quero assinalar a marca a qual o produto pertence, digamos samsung.

Agora, " Produto de teste 1 " está associado ao tipo "telefones celulares" e à marca "samsung" .

O resultado final desejado é:

  

/ products
  »Visualizar todas as postagens personalizadas

     

/ products / cell-phones
  »Veja todas as postagens personalizadas com os telefones celulares de taxonomia

     

/ product / telemóveis / samsung /
  »Veja todas as postagens personalizadas onde a taxonomia é telefones celulares AND samsung

     

/ products / telemóveis / samsung / test-product-1
  »Visualizar o produto (postagem personalizada única)


A questão

Como alguém tornaria isso possível? Meu pensamento inicial era usar uma taxonomia, tendo "telefones celulares" como o termo pai de "samsung" . De fato, acrescentar a taxonomia e seus termos não foi tão difícil. Mas isso levou a muitas outras questões, algumas bem conhecidas, outras nem tanto. De qualquer forma, não funciona assim, pois dá problemas 404 e o WP não permite certas coisas.
WP.org »taxonomy-archive-template

Isso me levou a ter repensado a estrutura, tendo que deixar taxonomias e seus termos e pensei; Por que não criar uma segunda taxonomia e associar o tipo de postagem a ela e anexá-la ao URL?

Boa pergunta, mas como?

    
por DRSK 21.10.2011 / 17:13

4 respostas

5

Isto é certamente possível, utilizando algumas regras de reescrita de sua preferência até certo ponto. A API WP_Rewrite expõe funções que permitem adicionar regras de reconfiguração (ou 'mapas') para converter uma solicitação em uma consulta.

Existem pré-requisitos para escrever boas regras de reescrita, e a mais importante é a compreensão básica de expressões regulares. O mecanismo de reescrita do WordPress usa expressões regulares para traduzir partes de um URL para consultas para obter posts.

Este é um pequeno e bom tutorial sobre PHP PCRE (expressões regulares compatíveis com Perl).

Então, você adicionou duas taxonomias, vamos supor que seus nomes sejam:

  • product_type
  • product_brand

Podemos usá-los em consultas assim:

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

A consulta seria ?product_type=cell-phones&product_brand=samsung . Se você digitar isso como sua consulta, você receberá uma lista de telefones Samsung. Para reescrever /cell-phones/samsung nessa consulta, uma regra de reconfiguração deve ser adicionada.

add_rewrite_rule() fará isso por você. Veja um exemplo de como sua regra de regravação pode se parecer no caso acima:

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

Você precisará flush_rewrite_rules() assim que adicionar a regra de reconfiguração para salvá-la no banco de dados. Isso é feito apenas uma vez, não há necessidade de fazer isso com cada solicitação, uma vez que uma regra é liberada. Para removê-lo, basta liberar sem a regra de reescrever adicionada.

Se você quiser adicionar paginação, faça o seguinte:

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

O resultado final

Isto é o que eu inventei parcialmente usando pedaços de todas as respostas que eu tenho:

/**
 * 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');


Algumas reflexões:

Isso funciona. Embora você seja para atribuir as taxonomias a cada postagem ou o URL terá um '/' » '/products/taxonomy//postname' . Como vou atribuir ambas as taxonomias a todos os meus procuts, tendo um tipo e uma marca, esse código parece estar funcionando para as minhas necessidades. Se alguém tiver sugestões ou melhorias, fique à vontade para responder!

    
por DRSK 22.10.2011 / 02:19
1

Verifique desta forma, ainda tem alguns bugs com arquivo de marca

enlace

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');
    
por Luis Abarca 21.10.2011 / 22:34
1

Embora não seja sua estrutura de URL desejada, você pode obter:

  

/ products
  »Visualizar todas as postagens personalizadas

     

/ products / type / cell-phones
  »Veja todas as postagens personalizadas com os telefones celulares de taxonomia

     

/ produtos / tipo / telefones celulares / marca / samsung
  »Veja todas as postagens personalizadas onde a taxonomia é telefones celulares AND samsung

     

/ brand / samsung
  »Veja todas as postagens personalizadas onde a taxonomia é samsung

     

/ product / test-product-1
  »Visualizar o produto (postagem personalizada única)

sem precisar especificar regras de re-gravação personalizadas.

Isso requer que você registre suas taxonomias e tipos de postagem personalizados em uma ordem específica. O truque é registrar qualquer taxonomia em que o slug comece com o slug do seu post antes de registrar esse tipo de post personalizado. Por exemplo, assuma as seguintes slugs:

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

Então você pode registrá-los nesta ordem:

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, 
        ) 
);

Se você tiver que ter um URL como:

  

/ produtos / tipo / telefones celulares / marca / samsung / teste-produto-1
  »Visualizar o produto (postagem personalizada única)

Então você precisaria de uma regra de reescrita como esta:

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

UPDATE enlace

Veja como você redefiniu corretamente o URL de postagem único.

Defina reescrever como falso para o tipo de postagem personalizado. (Deixe o arquivo como está) e depois de registrar as taxonomias e posts, também registre as seguintes regras de reescrita.

  '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);

Em seguida, filtre post_type_link para criar a estrutura de URL desejada, permitindo valores de taxonomia não definidos. Ao alterar o código da postagem vinculada, você teria:

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);

Agora, só preciso descobrir como reescrever o URL da taxonomia da marca sem a marca da marca principal e devo corresponder exatamente à URL desejada.

    
por marfarma 21.10.2011 / 21:41