Bien, el siguiente código debería hacer el truco por ti:
function get_clients_correct_template($single_template) {
global $post;
if ( 'clients' == $post->post_type ) {
$_template = false;
// Get all the terms for this post
$categories = wp_get_post_terms( $post->ID, 'clients_categories' );
if ( $categories && ! is_wp_error( $categories ) ) {
global $wp;
// I guessed that the client category that's in the URL will be in the query, but it's not, so we have to get it from $wp->matched_query
if ( preg_match( '~clients_categories=[\w|\d|-]*&?~', $wp->matched_query ) ) {
$slug = preg_replace( '~.*?clients_categories=([\w|\d|-]*)&?.*?$~', '', $wp->matched_query );
// See if the slug we found matches a slug of one of the client's categories
foreach ( $categories as $cat ) {
if ( $cat->slug == $slug ) {
$_template = locate_template( array( "single-clients-{$slug}.php" ), false );
break;
}
}
}
// If we haven't found a template yet, just assign the first found template
if ( ! $_template ) {
$_template = locate_template( array( "single-clients-{$categories[0]->slug}.php" ), false );
}
$single_template = $_template ? $_template : $single_template;
}
}
return $single_template;
}
// This is pre WP 3.4
add_filter( "single_template", "get_clients_correct_template", 1000 );
// This is post WP 3.4
add_filter( "clients_template", "get_clients_correct_template", 1000 );
// Fixes the permalinks for the "clients" post type
function clients_custom_permalink($permalink, $post_id, $leavename) {
if ( strpos( $permalink, 'client/' ) === FALSE || ! ( $post = get_post( $post_id ) ) || get_post_type( $post_id ) != 'clients' ) {
return $permalink;
}
// Get taxonomy terms
$terms = wp_get_object_terms( $post->ID, 'clients_categories' );
if ( ! is_wp_error( $terms ) && ! empty( $terms ) && is_object( $terms[0] ) ) {
$taxonomy_slug = false;
if ( is_tax( 'clients_categories' ) ) {
$term = get_queried_object();
$taxonomy_slug = $term->slug;
} else {
$taxonomy_slug = $terms[0]->slug;
}
} else {
$taxonomy_slug = 'no-category';
}
$replace_count = 1;
return preg_replace( '~client/~', $taxonomy_slug . '/', $permalink, $replace_count );
}
add_filter('post_link', 'clients_custom_permalink', 10, 3);
add_filter('post_type_link', 'clients_custom_permalink', 10, 3);
// Fixes the URL's for taxonomy archives
function clients_categories_custom_permalink($permalink, $term, $taxonomy) {
if ( $taxonomy != 'clients_categories' ) {
return $permalink;
}
return home_url( "/{$term->slug}/" );
}
add_filter( 'term_link', 'clients_categories_custom_permalink', 10, 3 );
// Generates custom rewrite rules for recognizing the custom Permalink structure for both "clients" posts and "clients_categories" terms
function add_client_rewrite_rules( $wp_rewrite ) {
static $did_rules = false;
if ( ! $did_rules ) {
$additional_rules = array();
$terms = get_terms( 'clients_categories', array( 'hide_empty' => false ) );
if ( $terms ) {
foreach ( $terms as $term ) {
// Add a rule for the taxonomy archives of the type "client-category-slug[/]" - the "/" is optional
$additional_rules[ "({$term->slug})/?$" ] = 'index.php?clients_categories=$matches[1]';
// Add a rule of the sort "client-category-slug/client-slug"
$additional_rules[ "({$term->slug})/([^/]*)" ] = 'index.php?clients_categories=$matches[1]&clients=$matches[2]';
// Add a rule of the sort "client-category-slug/parent-client-slug/client-slug"
$additional_rules[ "({$term->slug})/([^/]*)/([^/]*)" ] = 'index.php?clients_categories=$matches[1]&clients=$matches[3]';
}
$wp_rewrite->rules = array_merge( $additional_rules, $wp_rewrite->rules );
}
$did_rules = true;
}
}
add_action( 'generate_rewrite_rules', 'add_client_rewrite_rules' );
En cuanto al comienzo, asumí que la bala de tu tipo de publicación personalizada es clients
y la bala de tu taxonomía personalizada es clients_cateogires
. Si alguna de ellas es incorrecta, encuentra y reemplaza esas ocurrencias en mi código. .
En los argumentos para register_post_type()
para su tipo de publicación clients
, debe establecer rewrite
en:
'rewrite' => array( 'slug' => 'clients', 'with_front' => false ),
También en los argumentos para register_taxonomy()
tienes que configurar rewrite
en (cualquier otro slug también funcionará):
'rewrite' => array( 'slug' => 'client-category', 'with_front' => false ),
Por lo tanto, la primera función se enlaza con los ganchos de filtro single_template
y clients_template
. Puede leer en detalle sobre este enlace aquí , pero básicamente este enlace le permite cambiar la plantilla que se está cargando cuando se muestra una publicación en singular (página, publicación, publicación personalizada tipo publicación). Nos enganchamos a esta función, para que podamos cargar la plantilla adecuada cuando se está cargando una publicación de clientes.
Primero verificamos que el tipo de publicación de la publicación actual sea en realidad el objetivo ( clients
).
Luego obtenemos todas las categorías asociadas con el cliente actual. Si no hay categorías, dejamos que WordPress cargue la plantilla predeterminada.
Si hay categorías, primero verificamos si la URL consultada contiene un clients_categories
slug. Inicialmente pensé que WP agregaría el slug del clients_categories
que forma parte de la URL, pero parece que no lo hace. En su lugar, encontré que en la propiedad $matched_query
del objeto $wp
. Si coincide con una expresión regular simple, extraemos el slug y lo comparamos con los slug de las categorías a las que está asociado el client
actual. Si uno de ellos coincide, tratamos de encontrar una plantilla single-clients-{$slug}.php
.
Si no pudimos encontrar el término buscado, o la plantilla adecuada para este término, obtenemos la primera categoría para este cliente e intentamos encontrar la plantilla para él (usando su slug).
Al final, si hemos encontrado una plantilla adecuada, le asignamos la variable $single_template
, de lo contrario, conservamos su valor original.
Ahora, la segunda parte reemplaza client/
de los clientes permalink con el slug clients_categories
apropiado para este cliente. Tenga en cuenta que también verifica si estamos en un término de la taxonomía clients_categories
; si lo estamos, utilizará el slug del término actual. De lo contrario, agregará la bala del primer término que encuentre.
La tercera parte ( clients_categories_custom_permalink()
) corrige las URL para los archivos de taxonomía: de esta manera, la categoría "Web" estará en http://example.com/web/
.
La cuarta parte ( add_client_rewrite_rules()
) agrega algunas reglas de reescritura personalizadas. tenga en cuenta que para que estas surtan efecto, debe ir a Settings > Permalinks
, para que WordPress sepa lo que debe mostrar. cuando encuentra una URL como http://example.com/web/
o http://example.com/web/client-slug/
.
Tenga en cuenta que si tiene una página con una babosa que coincida con una de las babosas para sus Categorías de Clientes, lo más probable es que vea el archivo de taxonomía, en lugar de la página.