Debe tenerse en cuenta que si has_archive
se establece en verdadero al registrar el Tipo de publicación personalizado, el archivo de tipo de publicación /cptslug/
se reescribirá internamente en ?post_type=cptslug
. Así que esto también significaría que is_post_type_archive()
devolverá verdadero.
Desafortunadamente, cuando la bala de reescritura registrada es diferente al tipo de publicación, en realidad no se obtiene el post_type
. p.ej. si su tipo de publicación era myplugin_cars
y su bala de reescritura fue cars
y necesita obtener myplugin_cars
, incluso esto (para evitar errores si el objeto consultado actual es no un tipo de publicación personalizada ) seguirá fallando:
$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
if (isset($queryobject->rewrite['slug'])) {
$posttype = $queryobject->rewrite['slug'];
}
}
Pero como is_post_type_archive
es cierto, esto es más confiable:
if (is_post_type_archive()) {
$posttype = get_query_var('post_type');
// which is basically the same as:
// global $wp_query;
// $posttype = $wp_query->query_vars['post_type'];
}
else ($posttype = 'post';}
Pero espera, hay más ... resulta que con un poco de prueba, tampoco es así de simple ... ¿qué sucede si estás en una página de archivo de taxonomía con varios tipos de publicaciones en la taxonomía ...? ¿O asigna etiquetas de publicación a un tipo de publicación personalizado que no sea la publicación? ¿O están en una página de archivo de autor? Fecha de la página de archivo? ... o incluso tiene un tax_query
o meta_query
para WP_Query
?
La única respuesta confiable (sin probar cada caso de archivo posible) es hacer un bucle de las publicaciones reales en la consulta ... Aquí está la función completa que se me ocurrió para trabajar en páginas singulares y de archivo, y le permite opcionalmente, pase un objeto de consulta personalizado (o publicación de objeto / ID de publicación para publicaciones singulares):
function get_current_post_types($object=null) {
// if a numeric value passed, assume it is a post ID
if ( ($object) && (is_numeric($object)) ) {$object = get_post($object);}
// if an object is passed, assume to be a post object
if ( ($object) && (is_object($object)) ) {return get_post_type($object);}
// standard single post type checks
if (is_404()) {return '';}
// update: removed this check, handled by is_singular
// if (is_single()) {return 'post';}
if (is_page()) {return 'page';}
if (is_attachment()) {return 'attachment';}
if (is_singular()) {return get_post_type();}
// if a custom query object was not passed, use $wp_query global
if ( (!$object) || (!is_object($object)) ) {
global $wp_query; $object = $wp_query;
}
if (!is_object($object)) {return '';} // should not fail
// if the post_type query var has been explicitly set
// (or implicitly set on the cpt via a has_archive redirect)
// ie. this is true for is_post_type_archive at least
// $vqueriedposttype = get_query_var('post_type'); // $wp_query only
if (property_exists($object,'query_vars')) {
$posttype = $object->query_vars['post_type'];
if ($posttype) {return $posttype;}
}
// handle all other cases by looping posts in query object
$posttypes = array();
if (method_exists($object,'found_posts')) {
if ($object->found_posts > 0) {
$queriedposts = $object->posts;
foreach ($queriedposts as $queriedpost) {
$posttype = $queriedpost->post_type;
if (!in_array($posttype,$posttypes)) {$posttypes[] = $posttype;}
}
if (count($posttypes == 1)) {return $posttypes[0];}
else {return $posttypes;}
}
}
return ''; // nothin to see here
}
Esto confiablemente (¿lo dije?) devolverá una matriz de tipos de publicación si hay más de uno, o una cadena con el tipo de publicación única si solo hay un tipo.
Todo lo que necesitas hacer es:
$posttypes = get_current_post_types();
// or pass a post ID
$posttypes = get_current_post_types($postid);
// or pass a post object
$posttypes = get_current_post_types($post);
// or pass a custom query - that has been run
$posttypes = get_current_post_types($query);
Ejemplo de uso (solo por diversión):
add_filter('the_posts','myplugin_fading_thumbnails',10,2);
function myplugin_fading_thumbnails($posts,$query) {
if (!is_archive()) {return $posts;}
$cptslug = 'myplugin_slug'; $dosomethingcool = false;
$posttypes = get_current_post_types($query);
if ( (is_array($posttypes)) && (in_array($cptslug,$posttypes)) ) {$dosomethingcool = true;}
elseif ($cptslug == $posttypes) {$dosomethingcool = true;}
if ($dosomethingcool) {
global $fadingthumbnails; $fadingthumbnails = $cptslug;
if (!has_action('wp_footer','myplugin_cpt_script')) {
add_action('wp_footer','myplugin_cpt_script');
}
}
function myplugin_cpt_script() {
global $fadingthumbnails;
echo "<script>var thumbnailclass = 'img.thumbtype-".$fadingthumbnails."';
function fadeoutthumbnails() {jQuery(thumbnailclass).fadeOut(3000,fadeinthumbnails);}
function fadeinthumbnails() {jQuery(thumbnailclass).fadeIn(3000,fadeoutthumbnails);}
jQuery(document).ready(function() {fadeoutthumbnails();});
</script>";
}
return $posts;
}
Para ver el efecto, cambie el tipo de publicación personalizada en el código a post
, y agregue un atributo de clase thumbtype-post
a sus imágenes en miniatura de la publicación ...