Tipos de Post Personalizados en Páginas de Categorías
Estoy trabajando con un tipo de post personalizado que utiliza las categorías normales de WordPress.
Puedo modificar mi plantilla de categoría para mostrar mis tipos de post personalizados exactamente como quiero.
El problema es que, una vez que hago esto, las entradas normales del blog también se ven afectadas.
Por supuesto, puedo limitar las entradas normales del blog o el tipo de post a una sola categoría y crear un category-ID.php para trabajar solo con esa categoría.
Pero me pregunto si existe una solución más flexible.
¿Es posible crear plantillas de categoría que sean específicas para tipos de post, es decir, una para mostrar posts normales, otra para mostrar tipos de post personalizados, etc?
¿Es esto posible? Si no lo es, ¿cuál es la mejor manera de solucionarlo?

Para tipos de entradas personalizadas con taxonomías personalizadas, puedes crear una plantilla para esa taxonomía. Tu plantilla de taxonomía personalizada se nombraría taxonomy-{taxonomía}.php
. Por ejemplo, si tu taxonomía se llamara "categorias-cocina", nombrarías tu archivo taxonomy-categorias-cocina.php
.
Puedes encontrar más información sobre archivos de plantillas para archivos de taxonomías especiales en el codex aquí: http://codex.wordpress.org/Template_Hierarchy#Custom_Taxonomies_display

Puedes basarte en el tipo de publicación de la siguiente manera:
digamos que tienes category.php
para publicaciones regulares y your-custom-type-category.php
para tus publicaciones de tipo personalizado, entonces solo agrega esto a tu category.php regular al principio.
<?php if (have_posts()){
the_post();
if( 'your_custom_type' == get_post_type( $post ) ) {
rewind_posts();
get_template_part('your-custom-type-category');
exit();
}
rewind_posts();
}
?>
y ahora cuando se solicite una categoría, verificará si es de tu tipo de publicación personalizado y si lo encuentra usará tu your-custom-type-category.php
como plantilla, mientras que todas las publicaciones regulares se mostrarán usando category.php
sin cambios.
Espero que esto ayude

Hola @Kelvin Jayanoris:
¿Hay alguna razón por la que no puedas simplemente probar el valor de $post->post_type
con una declaración if..elseif
dentro de tu Loop, así:
<?php if ($post->post_type=='foo'): ?>
Coloca aquí el HTML para el tipo de post 'foo'...
<?php else if ($post->post_type=='bar'): ?>
Coloca aquí el HTML para el tipo de post 'bar'...
<?php else if ($post->post_type=='post'): ?>
Coloca aquí el HTML para el tipo de post 'post'...
<?php endif; ?>
¿O hay alguna razón por la que no puedas crear tu propia jerarquía de nombres de plantillas en forma de archivos como post-foo.php
, post-foo.php
, post-post.php
, también dentro de tu Loop?
Este fragmento de código podría hacerlo:
<?php include("post-{$post->post_type}.php"); ?>

Una solución más sencilla si no quieres crear archivos nuevos, o pasar por el problema de estropear tus consultas, es usar esto en tu functions.php:
function sql_where_clause($sql) {
if (is_category()) {
$sql = str_replace("cms_posts.post_type = 'post'", "cms_posts.post_type='post' OR cms_posts.post_type = 'news' OR cms_posts.post_type='event'", $sql);
}
return $sql;
}
add_filter('posts_where', 'sql_where_clause');
Por supuesto, necesitarás modificarlo para que incluya tus tipos de posts personalizados. Hice esto para que mi category.php respondiera a todos los tipos de posts personalizados que quería como si normalmente debieran estar ahí. Ahorra muchos problemas.
Edición: Ten cuidado con la versión de WP en la que uses esto. Parece que versiones antiguas de WP usaban wp_posts en lugar de cms_posts, así que verifica qué nombres de tablas estás buscando usar o tendrás resultados extraños (básicamente, no se mostrará nada)
