Obtém o tipo de post personalizado slug para uma página de arquivo

10

Como faço para descobrir o tipo de mensagem personalizada quando estou em uma página de arquivo?

Por exemplo, se /products/ disparar o modelo archive-products.php , como (pragmaticamente) recebo o slug de tipo de postagem?

Obrigado

    
por Ben Everard 07.10.2012 / 13:33

7 respostas

14

Para obter o tipo de postagem atual, use get_post_type() . Em seguida, peça get_post_type_object() para todos os dados que você precisa, por exemplo, o 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;
}
    
por fuxia 07.10.2012 / 15:48
5

Estou usando isso fora do loop no modelo archive.php para saber qual arquivo de postagem personalizado eu estou usando.

É uma combinação dos métodos que @toscho e @Rarst recomendaram:

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

Atualização: @majick apontou que isso só funciona se você tiver definido o slr de reescrita para o seu CPT. Rewrite slug é opcional quando se registra um CPT e o padrão é post_type se não for definido.

    
por Jerry 29.10.2014 / 16:42
1

t deve-se notar que se has_archive for definido como verdadeiro ao registrar o tipo de postagem personalizada, o arquivo de tipo de postagem /cptslug/ será reescrito internamente para ?post_type=cptslug . Então isso também significa que is_post_type_archive() retornará verdadeiro.

Infelizmente, onde o slr de reescrita registrado é diferente do tipo de postagem, na verdade você não está obtendo o post_type . por exemplo. se seu tipo de postagem era myplugin_cars e seu slw de reescrita era cars e você precisa estar recebendo myplugin_cars mesmo assim (para evitar erros se o objeto consultado atual não for um tipo de postagem personalizado ) ainda irá falhar:

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

Mas, como is_post_type_archive é verdadeiro, isso é mais confiável:

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';}

Mas aguente firme, tem mais ... acaba com um pequeno teste também não é assim tão simples ... e se você estiver em uma página de arquivo de taxonomia com vários tipos de postagens na taxonomia? Ou atribuir tags de post a um tipo de post personalizado diferente de post? Ou estão em uma página de arquivo de autor? Página de arquivamento de dados? ... ou até mesmo ter um complexo tax_query ou meta_query para WP_Query ?

A única resposta confiável (sem testes para todos os casos possíveis de arquivamento) é fazer o loop dos posts reais na consulta ... Aqui está a função completa que eu criei para trabalhar tanto no singular quanto no arquivo, permitindo que você Opcionalmente, passar um objeto de consulta personalizado (ou postar um objeto / ID de postagem para postagens 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
}

Isso irá, de forma confiável (eu digo isso?), retornar uma matriz de tipos de postagem se houver mais de um, ou uma string com o tipo de postagem único, se houver apenas um tipo. Tudo o que você precisa fazer é:

$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);

Exemplo de uso (apenas por diversão):

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 o efeito, altere o tipo de postagem personalizado no código para post e adicione um atributo thumbtype-post class às suas imagens em miniatura ...

    
por majick 06.06.2016 / 20:53
1

As respostas ficam confusas. E talvez eu esteja bem, mas a pergunta título é:

  

Obtenha um tipo de postagem personalizada slug para uma página de arquivo

Se você quer dizer arquivar tipo de arquivo página de destino, e quando is_post_type_archive() retorna true , você quer o slug que responde ao arquivo de visualização atual :

/* 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);

- FIM DE RESPONDER À PERGUNTA -

Explicação:

Você não pode confiar no slug registrado . Wordpress também não é. Por exemplo, ao chamar get_post_type_archive_link() , o Wordpress está verificando as regras de regravação atuais para a sua instalação .

Onde quer que você esteja, dentro ou fora do loop, arquivo atual ou postagem única, inverta o mecanismo get_post_type_archive_link() . (Permalinks habilitados.)

Considerações:

Como mencionado aqui, o (s) tipo (s) de postagem na consulta atual pode ser um array . Você pode ir mais longe com suas intenções e filtrar o tipo de postagem que você procura, por exemplo:

$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];

Outro ponto de vista:

O exemplo do Woocommerce é registrado com o tipo de objeto 'produtos', mas na realidade usa o nome da regra reescrita (loja):

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

Marque, estou usando $responding_name , porque os objetivos podem variar.   Um arquivo de postagem não existe, é apenas uma URL.

    
por cavameta 21.10.2017 / 20:32
0

Você pode usar este código:

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

use $ posttype_slug var o que você precisar

    
por Guy Ytzhak 03.06.2016 / 16:42
0

Você pode usar este código e este código está funcionando para mim,

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