Come ottenere il custom post type da una pagina archivio?

17 mar 2013, 21:02:10
Visualizzazioni: 46.1K
Voti: 9

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.

0
Tutte le risposte alla domanda 6
4
15

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.

17 mar 2013 21:36:10
Commenti

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.

pek pek
18 mar 2013 01:18:27

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;

pek pek
18 mar 2013 01:19:25

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.

Mark Mark
3 set 2015 18:14:32

get_queried_object() restituirà diversi oggetti a seconda del contesto.

s_ha_dum s_ha_dum
3 set 2015 18:26:42
0
10

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;
}
7 dic 2017 02:26:25
0

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;
}
29 ott 2020 16:50:00
1
die(var_dump(get_taxonomy(get_queried_object()->taxonomy)->object_type));

Penso che questa sia la risposta alla tua domanda.

Buona programmazione!!!

21 ott 2016 12:12:28
Commenti

Restituisce NULL, anche se ho provato su una pagina archivio. Non va bene.

WordPress Mechanic WordPress Mechanic
7 dic 2016 12:17:46
3

Perché non usare semplicemente get_query_var('post_type')?

https://developer.wordpress.org/reference/functions/get_query_var/

10 feb 2021 14:46:08
Commenti

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

Tony Djukic Tony Djukic
10 feb 2021 21:26:47

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

GantangPedia GantangPedia
11 feb 2021 05:05:12

Ad essere onesti, questa dovrebbe essere la risposta accettata

MikeeeG MikeeeG
11 ott 2024 14:07:04
0

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/

17 mar 2013 21:57:29