Come faccio a scoprire la lumaca del tipo di post personalizzato quando mi trovo su una pagina di archivio?
Ad esempio se /products/
spara ilarchive-products.php
modello, come (pragmaticamente) ottengo la lumaca di tipo post?
Grazie
Come faccio a scoprire la lumaca del tipo di post personalizzato quando mi trovo su una pagina di archivio?
Ad esempio se /products/
spara ilarchive-products.php
modello, come (pragmaticamente) ottengo la lumaca di tipo post?
Grazie
Risposte:
Per ottenere il tipo di post corrente utilizzare get_post_type()
. Quindi chiedi get_post_type_object()
tutti i dati di cui hai bisogno, ad esempio la lumaca:
$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');
... Ho aggiunto un'alternativa completa.
Sto usando questo al di fuori del ciclo sul modello archive.php per ottenere l'archivio post personalizzato su cui mi trovo.
È una combinazione dei metodi consigliati sia da @toscho che da @Rarst:
$post_type = get_queried_object();
echo $post_type->rewrite['slug'];
Aggiornamento: @majick ha sottolineato che funziona solo se hai impostato la lumaca di riscrittura per il tuo CPT. La riscrittura della lumaca è facoltativa quando si registra un CPT e per impostazione predefinita è post_type se non impostata.
Notice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
Le risposte diventano confuse. E forse lo sono anche io, ma la domanda principale è:
Ottenere messaggio personalizzato tipo slug per una pagina di archivio
Se vuoi dire pagina di destinazione dell'archivio di tipo post e quando is_post_type_archive()
ritorna true
, vuoi la lumaca che risponda all'archivio di visualizzazione corrente :
/* 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);
- FINE RISPOSTA ALLA DOMANDA -
Spiegazione:
Non puoi fare affidamento sulla lumaca registrata . Wordpress non è neanche. Ad esempio, quando si chiama get_post_type_archive_link()
Wordpress si verificano le regole di riscrittura correnti per l' installazione .
Ovunque tu sia, loop interno o esterno, archivio corrente o singolo post, inverti il get_post_type_archive_link()
meccanismo. (Permalink abilitati.)
considerazioni:
Come menzionato qui, i tipi di post nella query corrente possono essere un array
. Puoi andare oltre con le tue intensità con il filtro del tipo di post che cerchi, ad esempio:
$post_type = get_query_var('post_type');
if(is_array($post_type)) $post_type = reset($post_type);
o
if(isset($post_types[0])) $post_type = $post_types[0];
Un altro punto di vista:
Esempio di Woocommerce, è registrato con l'oggetto di tipo post "prodotti" ma in realtà usa il nome della regola riscritto (negozio):
/* returns shop */
$responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product')));
Segna, sto usando
$responding_name
, perché gli obiettivi potrebbero variare. Non esiste un archivio postale, è solo un URL.
Si noti che se has_archive
è impostato su true durante la registrazione del tipo di posta personalizzato, l'archivio del tipo di posta /cptslug/
verrà riscritto internamente ?post_type=cptslug
. Quindi questo significherebbe ancheis_post_type_archive()
che tornerà vero.
Sfortunatamente, dove la lumaca di riscrittura registrata è diversa dal tipo di posta, non si ottiene effettivamente il post_type
. per esempio. se il tuo tipo di post era myplugin_cars
e il tuo slug di riscrittura era cars
e devi riceverlo, myplugin_cars
anche questo (per prevenire errori se l'oggetto interrogato corrente non è un tipo di post personalizzato) fallirà comunque:
$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
if (isset($queryobject->rewrite['slug'])) {
$posttype = $queryobject->rewrite['slug'];
}
}
Ma poiché is_post_type_archive
è vero, questo è più affidabile:
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';}
Ma aspetta, c'è di più ... risulta con un piccolo test, non è nemmeno così semplice ... e se ti trovi in una pagina di archivio di tassonomia con più tipi di post nella tassonomia ..? O assegnare tag post a un tipo di post personalizzato diverso da post? Oppure sei su una pagina di archivio dell'autore? Pagina di archivio della data? ... o anche avere un complesso tax_query
o meta_query
perWP_Query
?
L'unica risposta affidabile (senza test per ogni possibile caso di archiviazione) è quella di eseguire il ciclo dei post effettivi nella query ... Ecco la funzione completa che mi è venuta in mente per lavorare su pagine singole e di archivio e che consente di passare facoltativamente un oggetto query personalizzato (o oggetto post / ID post per post singoli):
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
}
Ciò restituirà in modo affidabile (l'ho detto?) Restituirà una matrice di tipi di post se ne è presente più di uno, oppure una stringa con il singolo tipo di post se esiste un solo tipo. Tutto quello che devi fare è:
$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);
Esempio di utilizzo (solo per divertimento):
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;
}
Per vedere l'effetto, modifica il tipo di post personalizzato nel codice in post
e aggiungi un thumbtype-post
attributo di classe alle immagini in miniatura del post ...
Puoi usare questo codice:
$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;
usa $ posttype_slug var qualunque cosa ti serva
$queried_object->query_var['post_type'];
funzionare perché ...
?post_type=post
mi svuoto. confrontare conget_query_var('post_type');
Puoi usare questo codice e questo codice funziona per me,
$ t_slug = get_query_var ('term');
get_queried_object()
sarebbe arrivato alle stesse informazioni in meno mosse.