Ok, o código a seguir deve fazer o seguinte:
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' );
Como para começar, presumi que o slug do seu tipo de postagem personalizado é clients
e o tamanho da sua taxonomia personalizada é clients_cateogires
- se algum deles estiver incorreto, localize e substitua essas ocorrências no meu código .
Nos argumentos para register_post_type()
para o seu tipo de postagem clients
, você precisa definir rewrite
para:
'rewrite' => array( 'slug' => 'clients', 'with_front' => false ),
Também nos argumentos para register_taxonomy()
você precisa definir rewrite
para (qualquer outro slug funcionará também):
'rewrite' => array( 'slug' => 'client-category', 'with_front' => false ),
Assim, a primeira função conecta-se aos ganchos de filtro single_template
e clients_template
. Você pode ler em detalhes sobre esse gancho aqui , mas basicamente esse gancho permite que você altere o modelo que está sendo carregado quando uma postagem singular (página, postagem, pós-postagem personalizada) está sendo exibida. Nós nos conectamos a essa função, para que possamos carregar o modelo apropriado quando uma postagem de clientes estiver sendo carregada.
Primeiro, verificamos se o tipo de postagem da postagem atual é realmente o desejado ( clients
).
Em seguida, obtemos todas as categorias associadas ao cliente atual. Se não houver categorias, deixamos o WordPress carregar o modelo padrão.
Se houver categorias, primeiro verificaremos se o URL consultado contém um clients_categories
slug. Inicialmente eu pensei que o WP iria adicionar o slug do clients_categories
que faz parte do URL, mas parece que não faz. Em vez disso, descobri que na propriedade $matched_query
do objeto $wp
. Se ele corresponder a uma expressão regular simples, extraímos o slug e verificá-lo nas slugs das categorias às quais o client
atual está associado. Se uma delas corresponder, tentamos encontrar um modelo single-clients-{$slug}.php
.
Se não conseguimos encontrar o termo procurado, ou o modelo adequado para este termo, obtemos a primeira categoria para este cliente e tentamos encontrar o modelo para ele (usando o slug).
No final, se encontrarmos um modelo apropriado, definimos a variável $single_template
, senão preservamos seu valor original.
Agora, a segunda parte substitui client/
do permalink dos clientes pelo slug clients_categories
apropriado para esse cliente. Observe que ele também verifica se estamos em um termo do clients_categories
taxonomy - se estivermos, ele usará o slug do termo atual. Caso contrário, ele adicionará o slug do primeiro termo que encontrar.
A terceira parte ( clients_categories_custom_permalink()
) corrige as URLs dos arquivos de taxonomia - dessa forma, a categoria "Web" estará em http://example.com/web/
.
A quarta parte ( add_client_rewrite_rules()
) adiciona algumas regras de reescrita personalizadas - note que para que elas entrem em vigor, você precisa ir para Settings > Permalinks
- para que o WordPress saiba o que deve exibir quando encontrar um URL como http://example.com/web/
ou http://example.com/web/client-slug/
.
Observe que, se você tiver uma página com uma lesma que corresponda a uma das lesmas de suas Categorias de clientes, provavelmente verá o arquivo de taxonomia, em vez da página.