web-dev-qa-db-fra.com

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

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

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

Merci

11
Ben Everard

Pour obtenir le type de message actuel, 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;
}
14
fuxia

J'utilise ceci en dehors de la boucle sur le modèle archive.php pour obtenir l'archive personnalisée de publication 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 indiqué 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'enregistrement d'un CPT et par défaut à post_type si elle n'est pas définie.

6
Jerry

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

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

Si vous voulez dire archive de type post) landing-page et que, lorsque is_post_type_archive() renvoie true, vous souhaitez que le slug qui se rend à actuel archive visualisée:

/* 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 RÉPONSE À LA QUESTION -

Explication:

Vous ne pouvez pas compter sur le slug enregistré 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, reverse le mécanisme get_post_type_archive_link(). (Permaliens activés.)

_ {Considérations:

Comme mentionné ici, le type de publication dans requête en cours peut être une array. Vous pouvez aller plus loin avec vos intentions en filtrant 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];

Un autre point de vue:

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.

3
cavameta

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. Donc, cela signifierait également 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 devez obtenir myplugin_cars, alors même ceci (pour éviter les erreurs si l'objet demandé est non un type de message personnalisé) échouera quand même:

$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 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 ... s'avère avec un peu de test, ce n'est vraiment pas si simple non plus ... que se passe-t-il si vous êtes sur une page d'archive de taxonomie avec plusieurs types de message dans la taxonomie ...? Ou attribuer des étiquettes de publication à un type de publication personnalisé autre que publication? 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 publications réelles 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 passer éventuellement un objet de requête personnalisé (ou post object/post ID pour les posts singuliers):

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 va sûrement (est-ce que j'ai dit cela?) Retourner un tableau de types d'articles si plus d'un est présent, ou une chaîne avec le type d'article unique s'il n'y a qu'un seul type. Tout ce que vous devez faire c'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 de classe thumbtype-post à vos images miniatures de publication ...

1
majick

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

0
Guy Ytzhak

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

 $ t_slug = get_query_var ('term'); 
0
Navin Bhudiya