WordPress – Criando várias versões do mesmo single-customtype.php, dependendo de categorias de taxonomia selecionadas

Registrei um tipo de postagem personalizado ‘Clientes’ e uma taxonomia para este tipo de publicação para classificar postagens. Atualmente, existem 3 categorias para um projeto Cliente: Projeto ‘Logotipo’, ‘Projeto de Vídeo’ e ‘Projeto Web’.

Alguns clientes podem pertencer a várias categorias.

Na publicação Edit Page for a Clients, eu tenho um estruturador de layout de campo flexível que permite gerar ‘blocos’ de conteúdo para cada tipo de categoria (logotipo, web, vídeo …). Cada bloco terá campos únicos relevantes para cada categoria (ferramentas de upload de vídeo para vídeo, galerias de imagens para logotipo etc.)

O meu problema é que, embora eu possa exibir conteúdo relevante em páginas de categoria de taxonomia (mostre apenas o design web para todos os Clientes que estão na categoria de design web …), uma vez que o usuário clica para ver este Cliente, os clientes únicos. A página do PHP não possui nenhuma maneira de exibir apenas o conteúdo do Design da Web e filtrar outros “Blocos de conteúdo” nos casos em que um Cliente tenha> 1 bloco de conteúdo.

Idealmente, eu preciso de várias versões do modelo único de clientes:

algo como:

1) single-clients-web.php 2) single-clients-logo.php 3) single-clients-video.php 4) single-clients.php (shows all project blocks as it does now) 

OU

de alguma forma, pegue uma ID de referência e escreva um condicional que se o usuário clicou no cliente na página da categoria de design da web, a única página para a qual eles são direcionados mostra apenas os campos de design web.

Solutions Collecting From Web of "WordPress – Criando várias versões do mesmo single-customtype.php, dependendo de categorias de taxonomia selecionadas"

Ok, o seguinte código deve fazer o truque para você:

 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|-]*)&?.*?$~', '\1', $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' ); 

Quanto a um começo, presumi que o slug do seu tipo de postagem personalizado é o clients e o slug da sua taxonomia personalizada é clients_cateogires – se algum deles estiver incorreto, encontre e substitua essas ocorrências no meu código.

Nos argumentos para register_post_type() para o tipo de postagem de seus clients , você deve configurar a rewrite para:

 'rewrite' => array( 'slug' => 'clients', 'with_front' => false ), 

Também nos argumentos para register_taxonomy() você deve configurar a rewrite para (qualquer outra linguagem também funcionará):

 'rewrite' => array( 'slug' => 'client-category', 'with_front' => false ), 

Assim, a primeira function clients_template ganchos de filtros clients_template e clients_template . Você pode ler detalhadamente sobre esse gancho aqui , mas, basicamente, esse gancho permite que você altere o modelo que está sendo carregado quando um post (postagem de página, postagem personalizada personalizada) está sendo exibido. Ganhamos essa function, para que possamos carregar o modelo apropriado quando uma publicação de clientes está sendo carregada.

Primeiro, verificamos que o tipo de publicação da postagem atual é realmente o alvo ( 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 verificamos se o URL consultado contém uma slug de categorias de clients_categories . Inicialmente, pensei que o WP adicionaria a slug das categorias de clients_categories que faz parte do URL, mas parece que não. Em vez disso, encontrei isso na propriedade $matched_query do object $wp . Se ele coincide com uma expressão regular simples, extraímos a perna e verificamos isso contra os slugs das categorias com as quais o client atual está associado. Se um deles corresponda, tentamos encontrar um modelo single-clients-{$slug}.php .

Se não conseguimos encontrar o termo pesquisado ou o modelo apropriado para este termo, obtemos a primeira categoria para este cliente e tentamos encontrar o modelo para ele (usando slug).

No final, se encontrarmos um modelo apropriado, estabelecemos a variável $single_template para isso, caso contrário preservamos seu valor original.


Agora, a segunda parte substitui o client/ do cliente permalink com os clientes adequados slug para este cliente. Observe que ele também verifica se estamos em um termo da taxonomia de categorias de clients_categories – se nós estivermos, ele usará o slug do termo atual. Caso contrário, ele adicionará o slug do primeiro termo que ele encontra.


A terceira parte ( clients_categories_custom_permalink() ) corrige os URLs para os arquivos de taxonomia – desta forma a categoria “Web” será em http://example.com/web/ .


A quarta parte ( add_client_rewrite_rules() ) adiciona algumas regras de reescrita personalizadas – note, para que elas tenham efeito, você deve acessar Settings > Permalinks – para que o WordPress saiba o que deve exibir quando encontrar uma URL como http://example.com/web/ ou http://example.com/web/client-slug/ .


Observe que se você tiver uma página com uma lesão que corresponda a uma das lesmas para suas categorias de clientes – você provavelmente verá o arquivo de taxonomia, em vez da página.