Wordpress - Criando várias versões do mesmo single-customtype.php dependendo das categorias de taxonomia selecionadas

4

Registrei um tipo de postagem personalizada "Clientes" e uma taxonomia para esse tipo de postagem para categorizar postagens. Existem atualmente 3 categorias para um cliente: projeto 'Logo Project', 'Video Project' e 'Web Design'.

Alguns clientes podem pertencer a várias categorias.

Na página Editar para uma postagem de clientes, eu tenho um criador 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 logo etc.)

Meu problema é que, embora eu possa exibir conteúdo relevante em páginas de categoria de taxonomia (apenas mostrar design da web para todos os Clientes que estão na categoria de design da web ...), quando o usuário clica para visualizar esse cliente, A página -clients.php não tem como exibir APENAS o conteúdo do Web Design e filtrar outros "blocos de conteúdo" nos casos em que um cliente tem > 1 bloco de conteúdo.

Idealmente, 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)

OR

de alguma forma pegue um ID de referência e escreva uma condicional de 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 da web.

    
por Alex 29.11.2012 / 21:50

1 resposta

2

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.

    
por Nikola Ivanov Nikolov 29.11.2012 / 22:42