Cum poți afla tipul de postare personalizată dintr-o pagină de arhivă?
În site-ul meu am trei tipuri de postări personalizate: scripts, scenes și plugins. Când vizitezi pagina de arhivă a unui singur tip de postare (de exemplu, accesând mysite.com/plugins) se afișează corect toate postările de acel tip.
În archive.php, cum pot afla ce tip de postare personalizată vizualizează utilizatorul în acest moment?
Am încercat următorul cod:
<?php
global $post;
$postTypeLabels = get_post_type_labels(get_post_type_object($post));
echo var_export($postTypeLabels);
?>
Dar primesc următorul rezultat:
Post name is stdClass::__set_state(
array( 'name' => 'Posts',
'singular_name' => 'Post',
'add_new' => 'Add New',
'add_new_item' => 'Add New Post',
'edit_item' => 'Edit Post',
'new_item' => 'New Post',
'view_item' => 'View Post',
'search_items' => 'Search Posts',
'not_found' => 'No posts found.',
'not_found_in_trash' => 'No posts found in Trash.',
'parent_item_colon' => NULL,
'all_items' => 'All Posts',
'menu_name' => 'Posts',
'name_admin_bar' => NULL,
)
)
Bănuiesc că, fiind într-o pagină de arhivă, variabila $post nu este corectă.
P.S. Știu că pot crea archive-plugins.php pentru arhiva de plugin-uri. Din păcate, am instalat o temă care, din câte știu, într-un fel împiedică acest lucru. Deci această opțiune nu este disponibilă.
Există mai multe modalități de a face acest lucru. Puneți:
var_dump($wp_query->query,get_queried_object()); die;
În fișierul dvs. archive.php
și ar trebui să vedeți două dintre aceste modalități.
$wp_query->query
va avea componenta post_type
pentru tipurile personalizate de postări. Aceasta nu va fi prezentă pentru tipul de postări post
. get_queried_object
va returna destul de multe date pentru tipurile personalizate de postări, dar null pentru tipul de postări post
.
Există și unele etichete de șablon asociate care ar putea ajuta. is_post_type_archive
îmi vine în minte.
Între acestea, ar trebui să aveți informațiile necesare pentru a construi orice logică aveți nevoie. Nu este clar din întrebarea dumneavoastră care ar trebui să fie rezultatul final, așa că nu pot să scriu prea multe.
Deoarece ați menționat în mod specific archive.php
, acesta este fișierul pe care l-am testat. S-ar putea să aveți nevoie de cod diferit pentru un alt șablon, în special cu get_queried_object
, care returnează informații foarte diferite în funcție de context.

get_query_object() era ceea ce căutam. Practic, voiam să aflu cum să obțin numele tipului de postare personalizată, dar am preferat să păstrez întrebarea mai generală pentru alții. Mulțumesc.

Practic, asta am făcut pentru a obține numele tipului de postare personalizată în archive.php: $qObj = get_queried_object(); echo $qObj->labels->name;

Pentru cei care trec pe aici: aveți grijă când folosiți get_queried_object()
. Dacă is_post_type_archive()
este adevărat, dar utilizați și filtrare bazată pe taxonomie, termenul de taxonomie va avea prioritate. În acest caz, get_queried_object()
va returna un obiect de termen de taxonomie în loc de un obiect de tip postare, chiar dacă is_post_type_archive()
este adevărat.

Iată funcția pe care o dorești:
/**
* Obține numele tipului de postare curent pentru arhivă (ex: post, pagină, produs).
*
* @return String|Boolean Numele tipului de postare pentru arhivă sau false dacă nu se află pe o pagină de arhivă.
*/
function get_archive_post_type() {
return is_archive() ? get_queried_object()->name : false;
}

Am observat acest lucru în câteva comentarii la răspunsul acceptat, dar am vrut să clarific acest punct pentru alții care parcurg aceste răspunsuri: Obiectul global $wp_query
este mai sigur pentru a obține tipul de postare al arhivei. Mai exact din $wp_query->query['post_type']
.
Puteți folosi get_queried_object()
, dar are anumite limitări. În special dacă aveți alți parametri de interogare, cum ar fi termenii de taxonomie. În acest caz, get_queried_object()
va returna un obiect WP_Term în loc de tipul de postare pe care probabil îl căutați.
Deci, dacă arhiva are o interogare simplă pentru un tip de postare, atunci get_queried_object()
va funcționa. Dar pentru mai multă siguranță, folosiți obiectul global $wp_query
.
Iată o funcție pe care o puteți utiliza în tema dumneavoastră pentru acest lucru:
/*
* SCOP : Dacă există zero rezultate (sau alți parametri) în interogarea arhivei, get_post_type() nu este sigur pentru a determina tipul de postare al arhivei. Această funcție obține tipul de postare din obiectul global $wp_query.
* PARAM : n/a
* RETURNE : boolean / string - slug-ul pentru tipul de postare din $wp_query, sau false dacă acesta nu este găsit.
* 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;
}

De ce să nu folosești pur și simplu get_query_var('post_type')
?
https://developer.wordpress.org/reference/functions/get_query_var/

Încearcă să adaugi puțin mai multe informații în răspunsurile tale, acesta este mai degrabă un comentariu.

Păi nu există alte informații. Întrebarea este: În archive.php, cum pot afla ce tip de postare personalizată vizualizează utilizatorul în acest moment?
Cu get_query_var('post_type')
obții ce tip de postare personalizată vizualizează utilizatorul în acest moment

Nicio altă opțiune mai bună decât crearea unui șablon!
Sau includerea unui fișier de șablon atunci când este accesată arhiva acelui tip de postare personalizată (în funcție de URL-ul său).
Consultați link-urile de mai jos pentru mai multe informații:
http://codex.wordpress.org/Function_Reference/load_template
wordpress - încărcarea unui șablon pe baza URI-ului
http://www.mihaivalentin.com/wordpress-tutorial-load-the-template-you-want-with-template_redirect/
