Reescrita de URL de taxonomias de tipo de postagem personalizada

4

O que eu quero alcançar é um catálogo de listagem on-line com um URL como este:

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

Neste exemplo, tenho um tipo de postagem personalizado chamado "drawing-tools" com 4 taxonomias personalizadas para ele: "marca", "tipo", "material", "cor"

Quando um usuário acessa um URL como:

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

obtém todos os itens que correspondem a esses critérios.

A parte complicada é que todas as taxonomias precisam estar em um URL. Então, algo assim:

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

simplesmente retornaria uma página de erro 404.

Então, minha principal pergunta é:

Como exatamente posso ter todas as taxonomias no URL nesse formulário e retornar uma página de erro 404 se uma taxonomia estiver faltando?

Eu estava pensando em escrever uma regra de reescrita que pegaria esses segmentos uri e os passaria como argumentos para uma consulta baseada no Consultar múltiplos taxonomias ' plugin e retornar esse erro 404 se um segmento estiver faltando. Mas eu não sei como conseguir isso. Existe alguma solução que você possa me dar?

[Atualização 1]

A regra de regravação basicamente usaria este URL:

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

e faça isso em:

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

A estrutura acima é exigida pelo plug-in 'Query Multiple Taxonomies' .

[Atualização 2]

Eu desisti do plugin Query Multiple Taxonomies e mudei para o WP 3.1. Agora, com a ajuda desta pergunta anterior , consegui começar a trabalhar essas taxonomias como eu queria.

Aqui está o código completo:

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

Agora, quando um usuário acessa o link:

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

tudo funciona como esperado. O problema é que o usuário também pode acessar uma estrutura parcial como esta

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

e ainda obter resultados de acordo com essas taxonomias.

Como posso restringir o acesso de um usuário a esse URL e, em vez disso, retornar uma mensagem de erro 404?

    
por Jaquis 09.03.2011 / 14:45

2 respostas

1

A solução é bastante simples e não sei por que demorei tanto para encontrá-la no Codex. Você deve fazer uso da classe $wp_query .

Portanto, no modelo, antes de chamar o loop, defina uma variável para conter os dados retornados:

$vars = $wp_query->query_vars;

E, em seguida, verifique se as taxonomias necessárias estão definidas:

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

Se eles continuarem com o loop. Se não:

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

Pergunto-me, no entanto, se esta é a solução mais ideal.

    
por Jaquis 10.03.2011 / 20:42
2

Eu acredito que o WP 3.1 introduziu uma correção para o que você está descrevendo ... a partir do códice:

  • Aprimoramentos de tipo de conteúdo personalizado - permite que os desenvolvedores gerem páginas de arquivo e tenham melhores controles de menu e capacidade. Leia mais no artigo Post Types.
  • Consultas avançadas - permite que os desenvolvedores consultem várias taxonomias e campos personalizados

Eu ainda não usei nenhuma dessas melhorias, então não posso comentar especificamente, mas parece que é isso que você está procurando. Boa sorte!

    
por Taylor Dewey 09.03.2011 / 19:37