Come ottenere il custom post type da una pagina archivio?
Nel mio sito web ho tre custom post type: scripts, scenes e plugins. Quando si visita la pagina archivio di un singolo post type (ad esempio, andando su mysite.com/plugins) si vedono correttamente tutti i post di quel tipo.
In archive.php, come posso scoprire quale custom post type l'utente sta visualizzando in questo momento?
Ho provato quanto segue:
<?php
global $post;
$postTypeLabels = get_post_type_labels(get_post_type_object($post));
echo var_export($postTypeLabels);
?>
Ma ottengo questo:
Post name is stdClass::__set_state(
array( 'name' => 'Articoli',
'singular_name' => 'Articolo',
'add_new' => 'Aggiungi Nuovo',
'add_new_item' => 'Aggiungi Nuovo Articolo',
'edit_item' => 'Modifica Articolo',
'new_item' => 'Nuovo Articolo',
'view_item' => 'Visualizza Articolo',
'search_items' => 'Cerca Articoli',
'not_found' => 'Nessun articolo trovato.',
'not_found_in_trash' => 'Nessun articolo trovato nel Cestino.',
'parent_item_colon' => NULL,
'all_items' => 'Tutti gli Articoli',
'menu_name' => 'Articoli',
'name_admin_bar' => NULL,
)
)
Immagino che, dato che mi trovo in una pagina archivio, la variabile $post non sia corretta.
P.S. So che posso creare archive-plugins.php per l'archivio dei plugin. Sfortunatamente, ho installato un tema che, per quanto ne so, in qualche modo lo impedisce. Quindi questa non è un'opzione.
Ci sono diversi modi per farlo. Inserisci:
var_dump($wp_query->query,get_queried_object()); die;
Nel tuo archive.php
e dovresti vedere due di questi modi.
$wp_query->query
avrà il componente post_type
per i custom post type. Questo non sarà presente per i post type di tipo post
. get_queried_object
restituirà parecchi dati per i custom post type ma null per i post type di tipo post
.
Ci sono anche alcuni tag template correlati che potrebbero aiutare. is_post_type_archive
viene in mente.
Con questi dovresti avere le informazioni necessarie per costruire qualsiasi logica ti serva. Non è chiaro dalla tua domanda quale sia il risultato finale desiderato, quindi non posso scrivere molto di più.
Dato che hai specificamente nominato archive.php
, è quello che ho testato. Potresti aver bisogno di codice diverso per altri template, specialmente con get_queried_object
che restituisce informazioni molto diverse a seconda del contesto.

get_query_object() era ciò che stavo cercando. In pratica cercavo come ottenere il nome del custom post type, ma preferisco mantenere la domanda più aperta per chiunque altro. Grazie.

In pratica, questo è quello che ho fatto per ottenere il nome del custom post type nell'archive.php: $qObj = get_queried_object(); echo $qObj->labels->name;

Per chiunque passi di qui: fate attenzione a usare get_queried_object()
. Se is_post_type_archive()
è vero ma state anche usando un filtro basato su tassonomia, il termine della tassonomia avrà la precedenza. In questo caso get_queried_object()
restituirà un oggetto termine di tassonomia invece di un oggetto post type, anche se is_post_type_archive()
è vero.

Ecco la funzione che desideri:
/**
* Ottiene il nome del tipo di post corrente nell'archivio (es: post, page, product).
*
* @return String|Boolean Il nome del tipo di post dell'archivio o false se non si è in una pagina di archivio.
*/
function get_archive_post_type() {
return is_archive() ? get_queried_object()->name : false;
}

Ho notato questo in alcuni commenti sulla risposta accettata, ma volevo chiarire questo punto per chi scorre velocemente queste risposte: L'oggetto global $wp_query
è più affidabile per ottenere il tipo di post dell'archivio. Nello specifico da $wp_query->query['post_type']
.
Puoi usare get_queried_object()
ma ha delle limitazioni. In particolare se hai altri parametri di query come termini di tassonomia. In quel caso get_queried_object()
restituirà un oggetto WP_Term invece del tipo di post che probabilmente stai cercando.
Quindi se l'archivio ha una query pulita per un tipo di post, allora get_queried_object()
funzionerà. Ma per maggiore affidabilità usa l'oggetto global $wp_query
.
Ecco una funzione che puoi usare nel tuo tema per questo:
/*
* SCOPO : Se ci sono zero risultati (o altri parametri) nella query dell'archivio, get_post_type() non è affidabile per conoscere il tipo di post dell'archivio. Questa funzione ottiene il tipo di post dall'oggetto globale $wp_query.
* PARAMETRI: n/a
* RITORNA : boolean / string - lo slug del tipo di post da $wp_query, o false se non trovato.
* NOTE :
*/
function jp_get_archive_post_type(){
$post_type = false;
global $wp_query;
if( isset($wp_query->query['post_type']) ){
$post_type = $wp_query->query['post_type'];
}
return $post_type;
}

Perché non usare semplicemente get_query_var('post_type')
?
https://developer.wordpress.org/reference/functions/get_query_var/

Prova ad aggiungere un po' più di informazioni nelle tue risposte, questo è al massimo un commento.

Beh, non ci sono altre informazioni. La domanda è: In archive.php, come posso scoprire quale custom post type l'utente sta visualizzando in questo momento?
Con get_query_var('post_type')
ottieni quale custom post type l'utente sta visualizzando in questo momento

Non c'è altra bella opzione oltre alla creazione di template!
O includere un file template quando viene acceduto l'archivio di quel custom post type (secondo il suo URL).
Vedi i seguenti link per maggiori informazioni:
http://codex.wordpress.org/Function_Reference/load_template
wordpress - carica un template basato sull'URI
http://www.mihaivalentin.com/wordpress-tutorial-load-the-template-you-want-with-template_redirect/
