Wie entdecke ich den benutzerdefinierten Beitragstyp "Slug", wenn ich mich auf einer Archivseite befinde?
Wenn zum Beispiel /products/
die archive-products.php
Vorlage ausgelöst wird, wie erhalte ich (pragmatisch) den Post Type Slug?
Vielen Dank
Wie entdecke ich den benutzerdefinierten Beitragstyp "Slug", wenn ich mich auf einer Archivseite befinde?
Wenn zum Beispiel /products/
die archive-products.php
Vorlage ausgelöst wird, wie erhalte ich (pragmatisch) den Post Type Slug?
Vielen Dank
Antworten:
Verwenden Sie zum Abrufen des aktuellen Beitragstyps get_post_type()
. Dann fordern Sie get_post_type_object()
alle benötigten Daten an, zum Beispiel die Schnecke:
$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');
... Ich habe eine umfassende Alternative hinzugefügt.
Ich benutze dies außerhalb der Schleife in der Vorlage archive.php, um herauszufinden, in welchem benutzerdefinierten Post-Archiv ich mich befinde.
Es ist eine Kombination der von @toscho und @Rarst empfohlenen Methoden:
$post_type = get_queried_object();
echo $post_type->rewrite['slug'];
Update: @majick wies darauf hin, dass dies nur funktioniert, wenn Sie den Rewrite-Slug für Ihr CPT festgelegt haben. Rewrite Slug ist optional, wenn ein CPT registriert wird, und verwendet standardmäßig post_type, wenn es nicht festgelegt ist.
Notice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
Die Antworten werden verwirrend. Und vielleicht bin ich auch, aber die Schlagzeile lautet:
Erhalten Sie benutzerdefinierte Post Typ Slug für eine Archivseite
Wenn Sie die Zielseite eines Archivs vom Typ "Post" meinen und wenn Sie is_post_type_archive()
zurückkehren true
, möchten Sie den Slug, der auf das aktuelle Anzeigearchiv reagiert :
/* 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);
- ENDE DER BEANTWORTUNG DER FRAGE -
Erläuterung:
Sie können sich nicht auf die registrierte Schnecke verlassen . Wordpress ist auch nicht. Wenn Sie beispielsweise get_post_type_archive_link()
Wordpress anrufen, überprüfen Sie die aktuellen Umschreiberegeln für Ihre Installation .
Wo immer Sie sich befinden, innerhalb oder außerhalb des Loops, des aktuellen Archivs oder eines einzelnen Posts, kehren Sie denget_post_type_archive_link()
Mechanismus um. (Permalinks aktiviert.)
Überlegungen:
Wie hier erwähnt, können die Beitragstypen in der aktuellen Abfrage ein sein array
. Sie können Ihre Absichten weiter verfolgen, indem Sie den gewünschten Beitragstyp herausfiltern. Beispiel:
$post_type = get_query_var('post_type');
if(is_array($post_type)) $post_type = reset($post_type);
oder
if(isset($post_types[0])) $post_type = $post_types[0];
Eine andere Sicht:
Woocommerce-Beispiel ist mit dem Post-Typ-Objekt "Produkte" registriert, verwendet jedoch in Wirklichkeit den umgeschriebenen Regelnamen (Shop):
/* returns shop */
$responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product')));
Mark, ich benutze
$responding_name
, weil die Ziele variieren können. Ein Post-Archiv existiert nicht, es ist nur eine URL.
Es ist zu beachten, dass, wenn has_archive
bei der Registrierung des benutzerdefinierten Beitragstyps der Wert true festgelegt wird, das Beitragstyparchiv /cptslug/
intern neu geschrieben wird ?post_type=cptslug
. Das würde also auch heißenis_post_type_archive()
, dass es wahr wird.
Leider in dem die eingetragene Rewrite Slug ist unterschiedlich auf den Post - Typen, sind Sie nicht wirklich zuverlässig die bekommen post_type
. z.B. Wenn Ihr Beitragstyp myplugin_cars
und Ihr Umschreibefehler waren cars
und Sie dies erhalten müssen, schlägt myplugin_cars
auch dies fehl (um Fehler zu vermeiden, wenn das aktuell abgefragte Objekt kein benutzerdefinierter Beitragstyp ist):
$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
if (isset($queryobject->rewrite['slug'])) {
$posttype = $queryobject->rewrite['slug'];
}
}
Aber weil is_post_type_archive
es stimmt, ist dies zuverlässiger:
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';}
Aber Moment mal, es gibt noch mehr ... mit ein wenig Testen stellt sich heraus, dass es auch nicht so einfach ist ... Was ist, wenn Sie sich auf einer Taxonomie-Archivseite mit mehreren Beitragstypen in der Taxonomie befinden? Oder weisen Sie Beitrags-Tags einem anderen benutzerdefinierten Beitragstyp als dem Beitrag zu? Oder befinden Sie sich auf einer Autorenarchivseite? Datum Archivseite? ... oder haben sogar einen Komplex tax_query
oder meta_query
fürWP_Query
?
Die einzig verlässliche Antwort (ohne Prüfung für jeden möglichen Archivierungsfall) besteht darin, die tatsächlichen Posts in der Abfrage zu schleifen ... Hier ist die vollständige Funktion, mit der ich Singular- und Archivseiten bearbeitet habe und die es Ihnen ermöglicht, optional eine zu übergeben Benutzerdefiniertes Abfrageobjekt (oder Beitragsobjekt / Beitrags-ID für einzelne Beiträge):
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
}
Dies gibt zuverlässig (habe ich das gesagt?) Ein Array von Beitragstypen zurück, wenn mehr als einer vorhanden ist, oder eine Zeichenfolge mit dem einzelnen Beitragstyp, wenn es nur einen Typ gibt. Alles was Sie tun müssen, ist:
$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);
Beispielnutzung (nur zum Spaß):
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;
}
Um den Effekt zu sehen, ändern Sie den benutzerdefinierten Beitragstyp im Code in post
und fügen Sie thumbtype-post
Ihren Beitragsminiaturbildern ein Klassenattribut hinzu ...
Sie können diesen Code verwenden:
$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;
Verwenden Sie $ posttype_slug var, was auch immer Sie benötigen
$queried_object->query_var['post_type'];
dafür funktionieren ...
?post_type=post
ich leer werde. Vergleichen Sie mitget_query_var('post_type');
Sie können diesen Code verwenden und dieser Code funktioniert für mich,
$ t_slug = get_query_var ('term');
get_queried_object()
würde in weniger Zügen zu den gleichen Informationen kommen.