Holen Sie sich einen benutzerdefinierten Beitragstyp für eine Archivseite

14

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

Wenn zum Beispiel /products/die archive-products.phpVorlage ausgelöst wird, wie erhalte ich (pragmatisch) den Post Type Slug?

Vielen Dank

Ben Everard
quelle

Antworten:

18

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;
}
fuxia
quelle
1
Ich denke (hatte nicht getestet) get_queried_object()würde in weniger Zügen zu den gleichen Informationen kommen.
Rarst
@Rarst Vielleicht, aber ich denke, der Code, den ich vorgeschlagen habe, ist einfacher zu verstehen.
Fuxia
1
Die Lösungen von Toscho sind falsch, da get_post_type den Beitragstyp der aktuellen Seite zurückgibt und diese Funktion immer "Seite" zurückgibt, wenn Sie sich auf der Archivseite befinden. Ich habe vor, dasselbe zu lösen: Wenn ich mich auf der Archivseite von "Büchern" befinde (Beispiel 4), möchte ich Folgendes: "Bücher". Wenn ich es bekomme, werde ich es posten.
eMarine
1
Leider ist es nicht so einfach, obwohl Sie mit nur besser dran wären $posttype = get_query_var('post_type');... Ich habe eine umfassende Alternative hinzugefügt.
Majick
Ich glaube nicht, dass dies die Antwort auf die ganze Geschichte ist. Sie sollten die Regeln zum Umschreiben der Installation überprüfen, da viele Filter (z. B. die Seite des Woocommerce-Shops) Änderungen vornehmen. Verwende stattdessen den Worpdress-eigenen Mechanismus , siehe meine Antwort unten.
Jonas Lundman
6

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.

Jerry
quelle
als ich das versuchte, bekam ichNotice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
patrickzdb 20.10.15
Dies funktioniert nur, wenn das Umschreiben Slug ist für den registrierten CPT festgelegt, wie es um die post_type optional und standardmäßig ist
Majick
Vielen Dank für den Fang dieses @majick! Ich habe den Beitrag aktualisiert, um Ihre Informationen widerzuspiegeln.
Jerry
Es stellte sich heraus, dass dies die Spitze des Eisbergs war ... Überprüfen Sie meine neue Antwort für den Unterwasserteil :-)
Majick
3

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.

cavameta
quelle
Dies machte es sehr deutlich, danke. War auf der Suche nach dieser Lösung. Wenn die Frage nicht nach "nur dem Namen des Beitragstyps" suchte, sollte dies eine verbotene Antwort sein.
Jonas Lundman
1

Es ist zu beachten, dass, wenn has_archivebei 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_carsund Ihr Umschreibefehler waren carsund Sie dies erhalten müssen, schlägt myplugin_carsauch 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_archivees 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_queryoder meta_queryfü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 postund fügen Sie thumbtype-postIhren Beitragsminiaturbildern ein Klassenattribut hinzu ...

Majick
quelle
0

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

Guy Ytzhak
quelle
es muss $queried_object->query_var['post_type'];dafür funktionieren ...
Majick
$ Queried_object-> query_var enthält nur eine Zeichenfolge vom Typ post. Es ist kein Objekt oder Array. Schauen Sie sich dieses Bild an: prntscr.com/bd58e1
Guy Ytzhak
OK, aber nur wenn es sich bei dem abgefragten Objekt definitiv um ein benutzerdefiniertes Objekt vom Typ Beitrag handelt, erhalten Sie ein anderes entsprechendes Objekt und damit einen leeren Wert, zum Beispiel für Archivseiten für Kategorie / Steuer / Tag / Autor. auch weil ?post_type=postich leer werde. Vergleichen Sie mitget_query_var('post_type');
Majick
0

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

 $ t_slug = get_query_var ('term');
Navin Bhudiya
quelle
-3
if( get_post_type( get_the_ID() ) == 'projects' )
{
  //enter code for this post type
}
Subair
quelle