Reglas de reescritura para múltiples taxonomías (más de 2)

4

Estoy usando woocommerce y tengo algunos 'atributos de producto' que son solo taxonomías.

Tengo las siguientes taxonomías:

  • pa_color
  • pa_material
  • pa_style

pa_ significa atributo de producto y está integrado en WooCommerce que maneja estas taxonomías, así que no puedo cambiar eso.

WooCommerce también incluye categorías de productos (product_cat) y etiquetas de productos (product_tag) taxonomías.

la siguiente consulta me muestra todos los productos de vinilo en rojo en la categoría de productos de telas

  

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

Me gustaría convertir esto en un bonito enlace permanente, algo así como:

  

categoría de producto / telas / material / vinilo / color / rojo

Esta respuesta me acerca mucho a lo que estoy tratando de lograr:

reglas de reescritura de URL para consultas de taxonomías múltiples

en que puedo obtener mi URL para manejar 2 taxonomías (product_cat + 1 atributo taxonomía), pero estoy atascado en cómo obtener 3 (o más) parámetros.

Así puedo obtener:

  

/ categoría de productos / telas / color / rojo

o

  

/ categoría de producto / telas / material / vinilo

pero no los 3 juntos

  

/ categoría de producto / telas / material / vinilo / color / rojo

editar / aunque creo que sería ideal tener la URL

/ tejidos / vinilo / rojo

No estoy seguro de que sea posible?

finalizar edición /

WooCommerce también tiene algunas configuraciones para modificar los enlaces permanentes (como anteponer la URL con 'comprar' o cambiar la babosa de categoría de producto), así que tendré que tenerlo en cuenta al final, pero ahora mismo necesito obtener este primer paso. abajo.

para simplificar, esta es una versión simplificada de mi código. En realidad, estoy obteniendo las taxonomías de las funciones integradas de woocommerce, pero la pregunta no se limita a woocommerce ... ya que se refiere a cualquier sitio con muchas taxonomías.

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 fue el mejor recurso que he encontrado en los enlaces permanentes de consulta de taxonomía: enlace

pero también parece estar bloqueado en 2 taxonomías.

    
pregunta helgatheviking 06.03.2012 - 22:22

2 respuestas

3

Puedes intentar algo como esto:

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

Puede que no funcione exactamente como se anuncia, y es posible que tenga que hacer algunas modificaciones de expresiones regulares, pero esa es la esencia general de lo que se debe hacer (90% del trabajo).

Deberá limpiar los enlaces permanentes si agrega / edita / elimina este código, póngalo en functions.php o en un complemento personalizado. Puede vaciar los enlaces permanentes simplemente ingresando al área de administración y volviendo a guardar los enlaces permanentes

Como una nota al margen, puede que tenga problemas de conflicto si comienza a utilizar jerarquías,

por ejemplo Si tiene una categoría de camisetas / pequeñas y vestidos / pequeños, y usa una URL como / products-category / small / color / red, es posible que no obtenga los resultados que esperaba, por ejemplo. camisetas pequeñas? o te refieres a vestidos pequeños?

Así que ten cuidado con la ambigüedad

    
respondido por el Tom J Nowell 07.03.2012 - 00:38
2

Para futuras referencias (como el año que viene cuando busque en Google y vuelva a encontrar mi propia pregunta), esto se puede convertir a la sintaxis add_rewrite_rule() convirtiendo las claves de la matriz $new_rules en el parámetro $ regex de add_rewrite_rule() con el valor como $ rewrite y 'top' como la posición $.

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

O como ejemplo de una de mis solicitudes de arriba:

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 alguna razón, no pude usar regenerate_rewrite_rules como gancho / filtro, así que cambié a init.

    
respondido por el helgatheviking 06.03.2013 - 04:19

Lea otras preguntas en las etiquetas