Obtenir un slug de type message personnalisé pour une page d'archive

10

Comment découvrir le slug de type publication personnalisé lorsque je suis sur une page d'archive?

Par exemple, si /products/ tire le modèle archive-products.php , comment puis-je obtenir (de manière pragmatique) le slug de type de publication?

Merci

    
posée Ben Everard 07.10.2012 - 13:33

7 réponses

14

Pour obtenir le type de publication en cours, utilisez get_post_type() . Puis demandez à get_post_type_object() toutes les données dont vous avez besoin, par exemple le slug:

$post_type = get_post_type();
if ( $post_type )
{
    $post_type_data = get_post_type_object( $post_type );
    $post_type_slug = $post_type_data->rewrite['slug'];
    echo $post_type_slug;
}
    
réponse donnée fuxia 07.10.2012 - 15:48
5

J'utilise ceci en dehors de la boucle sur le modèle archive.php pour obtenir l'archive de publication personnalisée sur laquelle je suis.

C’est une combinaison des méthodes recommandées par @toscho et @Rarst:

$post_type = get_queried_object();
echo $post_type->rewrite['slug'];

Mise à jour: @majick a souligné que cela ne fonctionne que si vous avez défini le slug de réécriture pour votre CPT. La réécriture du slug est facultative lors de l’inscription d’un CPT et par défaut à post_type si elle n’est pas définie.

    
réponse donnée Jerry 29.10.2014 - 16:42
1

Il convient de noter que si has_archive est défini sur true lors de l’enregistrement du type de publication personnalisé, l’archive de type de publication /cptslug/ sera réécrite en interne sur ?post_type=cptslug . Cela signifie donc aussi que is_post_type_archive() retournera true.

Malheureusement, lorsque le slug de réécriture enregistré est différent du type de message, vous n'obtenez pas réellement le post_type de manière fiable. par exemple. si votre type de message était myplugin_cars et votre slug de réécriture était cars et que vous deviez obtenir myplugin_cars , alors même ceci (pour éviter les erreurs si l'objet interrogé actuel est pas un type de message personnalisé ) échouera toujours:

$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
    if (isset($queryobject->rewrite['slug'])) {
         $posttype = $queryobject->rewrite['slug'];
     }
 }

Mais comme is_post_type_archive 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 accrochez-vous, il y a plus encore ... s'avère avec un peu de test, ce n'est vraiment pas si simple non plus ... et si vous êtes sur une page d'archive de taxonomie avec plusieurs types de posts dans la taxonomie ...? Ou assigner des étiquettes de publication à un type de publication personnalisé autre que post? Ou sont sur une page d'archive auteur? Date archive page? ... ou même avoir un complexe tax_query ou meta_query pour WP_Query ?

La seule réponse fiable (sans tester chaque cas d’archive possible) est de boucler les posts réels dans la requête ... Voici la fonction complète que j’ai imaginée pour travailler à la fois sur les pages singulières et archivées, et vous permettant de: éventuellement passer un objet de requête personnalisé (ou un objet / un ID de publication pour des 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
}

Ceci retournera de manière fiable (est-ce que j'ai dit cela?) un tableau de types de publications si plus d'un est présent, ou une chaîne avec le type de publication unique s'il n'y a qu'un seul type. Tout ce que vous devez faire est:

$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, modifiez le type de publication personnalisé dans le code en post et ajoutez un attribut thumbtype-post class à vos images miniatures de publication ...

    
réponse donnée majick 06.06.2016 - 20:53
1

Les réponses deviennent confuses. Et peut-être que je suis aussi, mais la tête du titre est la suivante:

  

Obtenir le type de publication personnalisé slug pour une page d'archive

Si vous voulez dire archive de type d'article , et lorsque is_post_type_archive() renvoie true , vous souhaitez que le slug qui respecte l'enregistrement actuel :

/* returns /products/ */

$responding_name = str_replace(get_home_url(), '', get_post_type_archive_link(get_query_var('post_type')));

/* continue to get 'products' without slug slashes */
$responding_name = str_replace('/', '', $responding_name);

- FIN DE LA RÉPONSE À LA QUESTION -

Explication:

Vous ne pouvez pas compter sur le slug enregistré . Wordpress n'est pas non plus. Par exemple, lorsque vous appelez get_post_type_archive_link() , Wordpress vérifie les règles de réécriture actuelles pour votre installation .

Où que vous soyez, boucle interne ou externe, archive actuelle ou publication unique, inversez le mécanisme get_post_type_archive_link() . (Permaliens activés.)

Considérations:

Comme mentionné ici, le ou les types de publication dans la requête en cours peuvent être un array . Vous pouvez aller plus loin avec vos intentions et filtrer le type de message que vous recherchez, exemple:

$post_type = get_query_var('post_type'); 
if(is_array($post_type)) $post_type = reset($post_type);

ou

if(isset($post_types[0])) $post_type = $post_types[0];

Autre point de vue:

L'exemple Woocommerce est enregistré avec l'objet de type de publication 'products' mais utilise en réalité un nom de règle réécrit (boutique):

/* returns shop */
$responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product')));
  

Mark, j'utilise $responding_name , car les objectifs peuvent varier.   Une archive post n'existe pas, c'est juste une URL.

    
réponse donnée cavameta 21.10.2017 - 20:32
0

Vous pouvez utiliser ce code:

$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;

utilisez $ posttype_slug var comme vous le souhaitez

    
réponse donnée Guy Ytzhak 03.06.2016 - 16:42
0

Vous pouvez utiliser ce code et ce code fonctionne pour moi,

 $t_slug = get_query_var('term');
    
réponse donnée Navin Bhudiya 10.08.2016 - 06:50
-3
if( get_post_type( get_the_ID() ) == 'projects' )
{
  //enter code for this post type
}
    
réponse donnée subair 13.03.2014 - 05:22

Lire d'autres questions sur les étiquettes