Abrufen der benutzerdefinierten Archiv-URL von post_type

26

Es scheint eine dumme Frage zu sein. Aber ich kann es nicht herausfinden :(.

Ich muss zu Hause eine Schaltfläche anzeigen, die zur benutzerdefinierten Archiv-URL von post_type (archive- {post_type} .php) wechselt. Wie mache ich das?

ariefbayu
quelle
Welche Art von Schaltfläche, fügen Sie eine zu einem Navigationsmenü hinzu oder nur einen allgemeinen Link? Die Archiv-URL lautet im Allgemeinen, yoursite.com/type-slugsofern Sie sie nicht explizit auf etwas anderes festlegen, z. yoursite.com/some-other-url..
T31os
@ t31os: yup, im Moment habe ich es so hardcodiert. Aber wird es bald mit @ Mikes Code ändern.
Ariefbayu

Antworten:

25

Hi @Silent:

Es stellte sich heraus, dass es in WordPress 3.1 eine Funktion gibt, die genau das tut, was Sie wollen, und sie heißt get_post_type_archive_link(); So würden Sie es nennen (unter der Annahme eines benutzerdefinierten Beitragstyps mit dem Namen 'product'):

<a href="<?php echo get_post_type_archive_link('product'); ?>">Products</a>

Unten ist meine vorherige Antwort, bevor ich herausfand, dass WordPress tatsächlich eine Funktion für diesen Anwendungsfall eingebaut hat.

Vorherige Antwort:

Es sei denn, ich habe etwas im Kernquellcode für WordPress 3.1 übersehen. Ich glaube, Sie suchen nach einer Funktion, get_archive_link()die Sie wie folgt aufrufen könnten (unter der Annahme eines benutzerdefinierten Beitragstyps mit dem Namen 'product'):

<a href="<?php echo get_archive_link('product'); ?>">Products</a>

Und hier ist der Quellcode, den Sie in die function.phpDatei Ihres Themas oder in eine .phpDatei für ein Plugin, das Sie möglicherweise schreiben, einfügen können :

if (!function_exists('get_archive_link')) {
  function get_archive_link( $post_type ) {
    global $wp_post_types;
    $archive_link = false;
    if (isset($wp_post_types[$post_type])) {
      $wp_post_type = $wp_post_types[$post_type];
      if ($wp_post_type->publicly_queryable)
        if ($wp_post_type->has_archive && $wp_post_type->has_archive!==true)
          $slug = $wp_post_type->has_archive;
        else if (isset($wp_post_type->rewrite['slug']))
          $slug = $wp_post_type->rewrite['slug'];
        else
          $slug = $post_type;
      $archive_link = get_option( 'siteurl' ) . "/{$slug}/";
    }
    return apply_filters( 'archive_link', $archive_link, $post_type );
  }
}

Ich habe über das Wochenende tatsächlich an dieser genauen Logik gearbeitet, obwohl ich noch nicht 100% sicher bin, ob die Reihenfolge der Logik für alle Anwendungsfälle, die WordPress möglicherweise sieht, allgemein korrekt ist, obwohl sie wahrscheinlich für eine bestimmte Site funktionieren wird.

Dies ist auch ein großartiger Vorschlag, WordPress über trac hinzuzufügen, von dem ich glaube, dass ich es später am Abend tun werde.

MikeSchinkel
quelle
Übrigens, wenn Sie den Trac einreichen, können Sie ihn bitte hier verlinken.
Ariefbayu
@silent - Ja natürlich.
MikeSchinkel
@Mike - Ich hätte etwas Ähnliches geschrieben, wenn Sie nicht ...;) Ich habe mich gefragt, ob @silent daran gedacht hat, aber bei der Erwähnung eines Buttons musste ich an etwas anderes denken ...
t31os
@ t31os - Ich habe an diesem Wochenende an der gleichen Logik für mein URL-Routing-Plugin gearbeitet, also hatte ich einen Vorsprung. :) Was den Button angeht, könntest du eine Antwort hinzufügen, um das zu adressieren?
MikeSchinkel
Ich bin mir nicht sicher, ob es noch etwas zu
besprechen
12

Wenn Sie den Post-Typ registrieren, können Sie eine Zeichenfolge als Slug mit dem Parameter "has_archive" übergeben und sicherstellen, dass Sie auch "rewrite" auf "true" oder "array", jedoch nicht auf "false" setzen. Dann lautet Ihre CPT-Archiv-URL " http://www.YOURDOMAIN.com" / has_archive_slug zum Beispiel

Wenn Sie beispielsweise register_post_type eingeben:

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => 'product',
    'capability_type' => 'post',
    'has_archive' => 'products', 
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','author','thumbnail','excerpt','comments')
  ); 
 register_post_type('product',$args);

Dann lautet Ihre einzelne URL: http://www.YOURDOMAIN.com/product/postName und Ihre Archiv-URL: http://www.YOURDOMAIN.com/products/

Bainternet
quelle
3
Hurra. Ich hatte immer gedacht, es has_archivesei ein Boolescher Wert, aber jetzt weiß ich, dass er mit einer Zeichenfolge versehen werden kann, sodass mein einzelner benutzerdefinierter Post-Typ recipeeinen Plural-Slug haben kann/recipes/
Astrotim,
Ich erinnere mich nicht, ob / wann sie den Wechsel vorgenommen haben oder ob dies immer ein Fehler war, aber 2017 'rewrite'akzeptiert sie nur einen Booleschen Wert oder einen Array-Wert. 'rewrite' => 'product',Anstelle der von Ihnen aufgelisteten sollte es stattdessen sein 'rewrite' => array( 'slug' => 'product' ),.
Mike