it-swarm.com.de

Holen Sie sich einen benutzerdefinierten Beitragstyp für eine Archivseite

Wie entdecke ich den benutzerdefinierten Beitragstyp "Slug", wenn ich mich auf einer Archivseite befinde?

Wenn zum Beispiel /products/ die Vorlage archive-products.php abfeuert, wie (pragmatisch) erhalte ich den Post-Typ-Slug?

Vielen Dank

11
Ben Everard

Um den aktuellen Beitragstyp zu erhalten, verwenden Sie get_post_type(). Dann fragen Sie get_post_type_object() nach allen Daten, die Sie benötigen, zum Beispiel nach der 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;
}
14
fuxia

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.

6
Jerry

Die Antworten werden verwirrend. Und vielleicht bin ich auch, aber die Überschrift Frage ist:

Erhalte einen benutzerdefinierten Beitragstyp slug für eine Archivseite

Wenn Sie Posttyp Archiv Landing-Page meinen und is_post_type_archive()true zurückgibt, möchten Sie den Slug, der auf aktuell Viewing-Archiv 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 -

Erklärung:

Sie können sich nicht auf den registrierten Slug verlassen . Wordpress ist auch nicht. Wenn Sie beispielsweise get_post_type_archive_link() aufrufen, überprüft Wordpress die aktuellen Umschreiberegeln für Ihre Installation .

Wo immer Sie sich befinden, innerhalb oder außerhalb der Schleife, aktuelles Archiv oder einzelner Beitrag, umkehren der get_post_type_archive_link()-Mechanismus. (Permalinks aktiviert.)

Überlegungen:

Wie hier erwähnt, können die Post-Typen in Aktuelle Abfrage eine array sein. Sie können mit Ihren Intensionen weiter gehen, indem Sie den Post-Typ herausfiltern, nach dem Sie suchen. 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-Type-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')));

Markieren Sie, ich verwende $responding_name, da die Ziele variieren können. Ein Post-Archiv existiert nicht, es ist nur eine URL.

3
cavameta

es ist zu beachten, dass, wenn has_archive bei der Registrierung des benutzerdefinierten Post-Typs auf true gesetzt wird, das Post-Typ-Archiv /cptslug/ intern in ?post_type=cptslug umgeschrieben wird. Dies würde also auch bedeuten, dass is_post_type_archive() true zurückgibt.

Leider erhalten Sie den post_type nicht zuverlässig, wenn der registrierte Überschreibungsfehler anders als der Post-Typ ist. z.B. Wenn Ihr Beitragstyp myplugin_cars war und Ihr Überschreibungsfehler cars war und Sie myplugin_cars erhalten müssen, schlägt auch dieser fehl (um Fehler zu vermeiden, wenn das aktuell abgefragte Objekt nicht ein 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 wahr ist, 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 bisschen 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 Sie sogar einen komplexen tax_query oder meta_query für WP_Query?

Die einzig verlässliche Antwort (ohne jeden möglichen Archivierungsfall zu testen) 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);

Beispielgebrauch (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 Ihren Beitragsminiaturbildern ein thumbtype-post class-Attribut hinzu ...

1
majick

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

0
Guy Ytzhak

Sie können diesen Code verwenden und dieser Code funktioniert für mich,

 $ t_slug = get_query_var ('term'); 
0
Navin Bhudiya