Reescrever regras para várias taxonomias (mais de 2)

4

Estou usando o woocommerce e tenho alguns "atributos do produto", que são apenas taxonomias.

Eu tenho as seguintes taxonomias:

  • pa_color
  • pa_material
  • pa_style

o pa_ significa atributo de produto e é embutido no WooCommerce e lida com essas taxonomias, então não posso mudar isso.

O WooCommerce também vem com categorias de produtos (product_cat) e taxonomias de tags de produtos (product_tag).

a seguinte consulta obtém-me todos os produtos Red, Vinyl na categoria de produto Tecidos

  

? product_cat = fabrics & pa_material = vinyl & pa_color = red

Eu gostaria de transformar isso em um permalink bonito, algo como:

  

categoria de produto / tecidos / material / vinil / cor / vermelho

Essa resposta me deixa muito perto do que estou tentando alcançar:

Regras de reescrita de URLs para consultas de taxonomias múltiplas

em que eu posso obter o meu URL para lidar com 2 taxonomias (product_cat + 1 atributo taxonomia), mas estou preso em como obter 3 (ou mais) parâmetros.

Então eu posso conseguir:

  

/ categoria de produtos / tecidos / cor / vermelho

ou

  

/ categoria do produto / tecidos / material / vinil

mas não todos os 3 juntos

  

/ categoria do produto / tecidos / material / vinil / cor / vermelho

editar / embora eu ache que seria ideal ter o URL

/ tecidos / vinil / vermelho

não tenho certeza de que isso é possível?

end edit /

O WooCommerce também tem algumas configurações para modificar os permalinks (como preceder o URL com 'loja' ou alterar o slogan da categoria do produto), então vou precisar explicar isso eventualmente, mas agora preciso obter este primeiro passo para baixo.

para simplificar, esta é uma versão simplificada do meu código. Na verdade, estou obtendo as taxonomias de funções de comércio interno, mas a questão não está limitada a woocommerce ... no que se refere a qualquer site com muitas taxonomias.

add_action( 'init', 'wpa_init' );
function wpa_init() {

$taxonomies = array ('pa_color'=>'Color','pa_material'=>'Material','pa_style'=>'Style');
$base = 'product-category';

        foreach ($taxonomies as $taxonomy=>$mask):      
            $attribute = strtolower(sanitize_title($mask));
            add_rewrite_rule( $base.'/(.+?)/'.$attribute.'/([^/]+)(/page/(\d+))?/?$', 'index.php?product_cat=$matches[1]&'.$taxonomy.'=$matches[2]&paged=$matches[4]', 'top' );         
        endforeach;     
}

este foi o melhor recurso que encontrei em permalinks de consulta de taxonomia: enlace

mas também parece estar preso a 2 taxonomias.

    
por helgatheviking 06.03.2012 / 22:22

2 respostas

3

Você pode tentar algo assim:

function custom_rewrite( $wp_rewrite ) {

    $feed_rules = array(
        'product-category/(.+)/material/(.+)/color/(.+)'    =>  'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_material='. $wp_rewrite->preg_index(2).'&pa_color='. $wp_rewrite->preg_index(3)
        'product-category/(.+)/color/(.+)'    =>  'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_color='. $wp_rewrite->preg_index(2)
        'product-category/(.+)/material/(.+)'    =>  'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_material='. $wp_rewrite->preg_index(2)
    );

    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( 'generate_rewrite_rules', 'custom_rewrite' );

Pode não funcionar exatamente como anunciado, e você pode precisar fazer algumas modificações de regex, mas essa é a essência geral do que precisa ser feito (90% do trabalho).

Você precisará liberar os permalinks se adicionar / editar / remover este código, colocá-lo em functions.php ou em um plugin personalizado. Você pode liberar permalinks simplesmente acessando a área administrativa e salvando novamente os permalinks

Como participante, você pode se deparar com problemas conflitantes se começar a usar hierarquias,

por exemplo. Se você tiver uma camiseta / pequena e uma categoria de vestidos / pequena, e usar um URL como / products-category / small / color / red, talvez não receba os resultados esperados, por exemplo, tshirts pequenos? ou você quis dizer vestidos pequenos?

Portanto, cuidado com a ambigüidade

    
por Tom J Nowell 07.03.2012 / 00:38
2

Para referência futura (como no próximo ano, quando eu pesquisar no Google e encontrar minha própria pergunta novamente), isso pode ser convertido em add_rewrite_rule() syntax convertendo as chaves na matriz $new_rules no parâmetro $ regex de add_rewrite_rule() com o valor como $ reescrita e 'top' como a posição $.

add_rewrite_rule($regex,$rewrite, $position);

Ou como um exemplo de um dos meus pedidos acima:

function custom_rewrite() {

   add_rewrite_rule(
    'product-category/(.+?)/material/(.+?)/?$',
    'index.php?product_cat=matches[1]&pa_material=$matches[2]',
    'top'
    );

}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_action( 'init', 'custom_rewrite' );

Por alguma razão, eu não tive sucesso usando regenerate_rewrite_rules como um gancho / filtro então mudei para o init.

    
por helgatheviking 06.03.2013 / 04:19