Wordpress - Creando múltiples versiones del mismo tipo de archivo único personalizado según las categorías de taxonomía seleccionadas

4

He registrado un tipo de publicación personalizada 'Clientes' y una taxonomía para este tipo de publicación para clasificar publicaciones. Actualmente hay 3 categorías para un cliente: Proyecto de logotipo, Proyecto de video y Proyecto de diseño web.

Algunos clientes pueden pertenecer a varias categorías.

En la página Editar para una publicación de Clientes, tengo un generador de diseño de campo flexible que te permite generar 'bloques' de contenido para cada tipo de categoría (logotipo, web, video ...). Cada bloque tendrá campos únicos relevantes para cada categoría (herramientas de carga de video para videos, galerías de imágenes para el logotipo, etc.)

Mi problema es que, si bien puedo mostrar contenido relevante en las páginas de categorías de taxonomía (solo mostrar diseño web para todos los Clientes que están en la categoría de diseño web ...), una vez que el usuario hace clic para ver este Cliente, el único La página -clients.php no tiene forma de SOLO mostrar contenido de Diseño Web y filtrar otros 'Bloques de contenido' en los casos en que un Cliente tiene > 1 bloque de contenido.

Idealmente necesito varias versiones de la plantilla única de los 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)

O

de alguna manera, tome un ID de referencia y escriba un condicional que, si el usuario hizo clic en el cliente desde la página de categoría de diseño web, la única página a la que se dirige solo muestra los campos de diseño web.

    
pregunta Alex 29.11.2012 - 21:50

1 respuesta

2

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.

    
respondido por el Nikola Ivanov Nikolov 29.11.2012 - 22:42

Lea otras preguntas en las etiquetas