Si bien no es su estructura de URL deseada exacta, puede obtener:
/ productos
»Ver todas las publicaciones personalizadas
/ productos / type / cell-phones
»Ver todas las publicaciones personalizadas con la taxonomía de teléfonos celulares
/ productos / tipo / teléfonos celulares / marca / samsung
»Ver todas las publicaciones personalizadas donde la taxonomía es teléfonos celulares Y samsung
/ brand / samsung
»Ver todas las publicaciones personalizadas donde la taxonomía es samsung
/ product / test-product-1
»Ver el producto (publicación única personalizada)
sin tener que especificar reglas de reescritura personalizadas.
Sin embargo, requiere que registres tus taxonomías y tipos de publicaciones personalizadas en un orden particular. El truco consiste en registrar cualquier taxonomía donde la babosa comienza con la babosa de su tipo de publicación antes de registrar ese tipo de publicación personalizada. Por ejemplo, suponga las siguientes babosas:
product_type taxonomy slug = products/type
product custom_post_type slug = product
product custom_post_type archive slug = products
product_brand taxonomy slug = brand
Luego puede registrarlos en este orden:
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,
)
);
Si absolutamente tiene que tener una URL como:
/ productos / tipo / teléfonos celulares / marca / samsung / test-product-1
»Ver el producto (publicación personalizada única)
Entonces necesitaría una regla de reescritura similar a esta:
add_rewrite_rule(
'/products/type/*/brand/*/([^/]+)/?',
'index.php?pagename='product/$matches[1]',
'top' );
ACTUALIZAR
/programming/3861291/multiple-custom-permalink-structures-in-wordpress
Así es como redefine correctamente la URL de publicación única.
Establezca re-write en false para el tipo de publicación personalizada. (Deje el archivo como está) y luego, después de registrar las taxonomías y publicaciones, también registre las siguientes reglas de reescritura.
'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);
Luego filtre post_type_link para crear la estructura de URL deseada, permitiendo valores de taxonomía no establecidos. Modificando el código de la publicación vinculada, tendría:
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);
Ahora solo necesito descubrir cómo volver a escribir la url de taxonomía de marca sin la etiqueta de marca líder, y debería coincidir exactamente con la URL deseada.