Como descubro a lesma de tipo de postagem personalizada quando estou em uma página de arquivo?
Por exemplo, se /products/
dispara o archive-products.php
modelo, como (pragmaticamente) obtenho a lesma do tipo de postagem?
obrigado
Como descubro a lesma de tipo de postagem personalizada quando estou em uma página de arquivo?
Por exemplo, se /products/
dispara o archive-products.php
modelo, como (pragmaticamente) obtenho a lesma do tipo de postagem?
obrigado
Respostas:
Para obter o tipo de postagem atual, use get_post_type()
. Em seguida, peça get_post_type_object()
todos os dados necessários, por exemplo, a lesma:
$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;
}
$posttype = get_query_var('post_type');
... Adicionei uma alternativa abrangente.
Estou usando isso fora do loop no modelo archive.php para obter em qual post archive personalizado estou.
É uma combinação dos métodos recomendados pelo @toscho e pelo @Rarst:
$post_type = get_queried_object();
echo $post_type->rewrite['slug'];
Atualização: @majick apontou que isso só funciona se você tiver definido a lesma de reescrita para o seu CPT. A opção Reescrever slug é opcional ao registrar um CPT e o padrão é post_type, se não estiver definido.
Notice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
As respostas ficam confusas. E talvez eu também esteja, mas a pergunta principal é:
Obter slug de tipo de postagem personalizado para uma página de arquivo
Se você quer dizer a página de destino do arquivo de tipo de postagem e, quando is_post_type_archive()
retornar true
, deseja a lesma à qual está respondendo 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 na lesma registrada . Wordpress também não é. Por exemplo, ao ligar para o get_post_type_archive_link()
Wordpress, verifique as regras de reescrita atuais para o seu instalação .
Onde você estiver, loop interno ou externo, arquivo atual ou postagem única, inverta oget_post_type_archive_link()
mecanismo. (Ligações permanentes ativadas.)
Considerações:
Conforme mencionado aqui, o (s) tipo (s) de postagem na consulta atual pode ser um array
. Você pode ir mais longe com suas intensões filtrando o tipo de postagem que 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:
Exemplo de Woocommerce, é registrado com o objeto de tipo de publicação '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 morto não existe, é apenas um URL.
Deve-se observar que, se has_archive
definido como true durante o registro do Tipo de postagem personalizado, o arquivo do tipo de postagem /cptslug/
será reescrito internamente ?post_type=cptslug
. Então isso também significariais_post_type_archive()
que retornará verdadeiro.
Infelizmente, onde a lesma de reescrita registrada é diferente do tipo de postagem, você não está realmente obtendo a post_type
. por exemplo. se o seu tipo de postagem foi myplugin_cars
e sua lesma de reescrita foi cars
e você precisa obtê-lo myplugin_cars
, mesmo isso (para evitar erros se o objeto consultado atual não for um tipo de postagem personalizado) ainda falhará:
$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
if (isset($queryobject->rewrite['slug'])) {
$posttype = $queryobject->rewrite['slug'];
}
}
Mas porque is_post_type_archive
é verdade, 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 espere, há mais ... Acontece que, com um pouco de teste, também não é tão simples assim ... e se você estiver em uma página de arquivo de taxonomia com vários tipos de postagem na taxonomia ..? Ou atribuir tags de postagem a um tipo de postagem personalizado que não seja a postagem? Ou estão em uma página de arquivo do autor? Página de arquivo de data? ... ou mesmo tem um complexo tax_query
ou meta_query
para WP_Query
?
A única resposta confiável (sem teste para todos os casos possíveis de arquivamento) é repetir as postagens reais na consulta ... Aqui está a função completa que criei para trabalhar em páginas singulares e de arquivamento, e permitindo que você passe opcionalmente um objeto de consulta personalizado (ou objeto de postagem / ID da 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 retornará de forma confiável (eu disse isso?) Uma matriz de tipos de postagem, se houver mais de um, ou uma string com o único tipo de postagem, se houver apenas um tipo. Tudo 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 thumbtype-post
atributo de classe às suas imagens em miniatura da postagem ...
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
$queried_object->query_var['post_type'];
que isso funcione ... #
?post_type=post
eu fico vazio. compare comget_query_var('post_type');
Você pode usar esse código e esse código está funcionando para mim,
$ t_slug = get_query_var ('termo');
get_queried_object()
obteria a mesma informação em menos movimentos.