Il convient de noter que s'il has_archive
est défini sur true lors de l'enregistrement du type de publication personnalisé, l'archive du type de publication /cptslug/
sera réécrite en interne ?post_type=cptslug
. Donc, cela signifierait également que le résultat is_post_type_archive()
sera vrai.
Malheureusement, lorsque le slug de réécriture enregistré est différent du type de publication, vous n'obtenez pas réellement de manière fiable post_type
. par exemple. si votre type de publication était myplugin_cars
et que votre slug de réécriture l'était cars
et que vous devez obtenir myplugin_cars
alors même cela (pour éviter les erreurs si l'objet interrogé actuel n'est pas un type de publication personnalisé) échouera toujours:
$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
if (isset($queryobject->rewrite['slug'])) {
$posttype = $queryobject->rewrite['slug'];
}
}
Mais parce que is_post_type_archive
c'est vrai, c'est plus fiable:
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';}
Mais attendez, il y a plus ... il s'avère qu'avec un peu de test ce n'est vraiment pas aussi simple non plus ... et si vous êtes sur une page d'archive de taxonomie avec plusieurs types de messages dans la taxonomie ..? Ou attribuer des balises de publication à un type de publication personnalisé autre que la publication? Ou êtes-vous sur une page d'archive d'auteur? Page d'archive de date? ... ou même avoir un complexe tax_query
ou meta_query
pourWP_Query
?
La seule réponse fiable (sans tester tous les cas d'archives possibles) est de boucler les messages réels dans la requête ... Voici la fonction complète que j'ai trouvée pour travailler à la fois sur les pages singulières et d'archivage, et vous permettant éventuellement de passer un objet de requête personnalisé (ou objet de publication / ID de publication pour les publications singulières):
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
}
Cela renverra de manière fiable (ai-je dit cela?) Un tableau de types de publication s'il y en a plusieurs, ou une chaîne avec le type de publication unique s'il n'y a qu'un seul type. Il vous suffit de:
$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);
Exemple d'utilisation (juste pour le plaisir):
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;
}
Pour voir l'effet, changez le type de publication personnalisé dans le code en post
et ajoutez un thumbtype-post
attribut de classe à vos images miniatures de publication ...
get_queried_object()
obtiendrait les mêmes informations en moins de mouvements.